2016 - 2024

感恩一路有你

二叉树的非递归遍历

浏览量:4085 时间:2024-01-12 09:31:09 作者:采采

第一章:介绍

在这篇文章中,我们将讨论二叉树的非递归遍历。首先,让我们了解算法的背景和实验内容。

第二章:算法规范

(1) 前序遍历:

前序遍历是指在处理子节点之前先处理节点本身。代码如下:

```

// 前序遍历

void preorderTraversal(TreeNode* root) {

stack s;

TreeNode* node root;

while (!s.empty() || node ! NULL) {

if (node ! NULL) {

// 处理节点

cout << node->val << " ";

s.push(node);

node node->left;

} else {

node ();

s.pop();

node node->right;

}

}

}

```

(2) 中序遍历:

中序遍历是指在处理左右子节点之间先处理节点本身。代码如下:

```

// 中序遍历

void inorderTraversal(TreeNode* root) {

stack s;

TreeNode* node root;

while (!s.empty() || node ! NULL) {

if (node ! NULL) {

s.push(node);

node node->left;

} else {

node ();

s.pop();

// 处理节点

cout << node->val << " ";

node node->right;

}

}

}

```

(3) 后序遍历:

后序遍历是指在处理子节点之后才处理节点本身。代码如下:

```

// 后序遍历

void postorderTraversal(TreeNode* root) {

stack s1, s2;

TreeNode* node root;

s1.push(node);

while (!s1.empty()) {

node ();

s1.pop();

s2.push(node);

if (node->left ! NULL) {

s1.push(node->left);

}

if (node->right ! NULL) {

s1.push(node->right);

}

}

while (!s2.empty()) {

node ();

s2.pop();

// 处理节点

cout << node->val << " ";

}

}

```

第三章:源代码(C语言)

第四章:测试结果

测试一:

测试目的:使用普通二叉树验证程序的正确性。

预期结果:(前序遍历)A B D G C E F ,(中序遍历)D G B A E C F,(后序遍历)G D B E F C A

程序实际运行结果:

测试二:

测试目的:使用完全二叉树验证程序的正确性。

预期结果:(前序遍历)A B D E C F,(中序遍历)D B E F C,(后序遍历)D E B F C A

程序实际运行结果:

测试三:

测试目的:使用满二叉树验证程序的正确性。

预期结果:(前序遍历)A B D E C F G,(中序遍历)D B E A F C G,(后序遍历)D E B F G C A

程序实际运行结果:

第五章:分析和评论

通过对二叉树的非递归遍历实现,每个节点只需要遍历一次,所以算法的时间复杂度为O(n)。对于进一步可能的改进,也许可以尝试使用两个栈来实现后序遍历。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。