二叉树的非递归遍历
第一章:介绍
在这篇文章中,我们将讨论二叉树的非递归遍历。首先,让我们了解算法的背景和实验内容。
第二章:算法规范
(1) 前序遍历:
前序遍历是指在处理子节点之前先处理节点本身。代码如下:
```
// 前序遍历
void preorderTraversal(TreeNode* root) {
stack
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
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
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)。对于进一步可能的改进,也许可以尝试使用两个栈来实现后序遍历。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。