二叉树的非递归遍历
来源:互联网 发布:jdbc连接数据库5个步骤 编辑:程序博客网 时间:2024/06/05 17:45
首先,我们把二叉树看成,root,left,right。来分析如何实现非递归二叉树的前,中,后遍历。
前序遍历:
次序为:root,left,right。
//非递归前序遍历二叉树void preorder(NODE *t) { if (t == NULL) return; stack<NODE *> s; s.push(t); while (!s.empty()) { NODE *root = s.top();//赋值一份当前双亲节点 cout << root->data <<" "; s.pop(); //先存储右子树,确保先输出左子树 if (root->rc) s.push(root->rc); //后存储左子树 if (root->lc) s.push(root->lc); }}
中序遍历:
次序为:left,root,right。
//非递归中序遍历二叉树void inorder(NODE *t) { if (t == NULL) return; NODE *root = t; stack<NODE *>s; while (root != NULL || !s.empty()) { while (root != NULL) { //一路直走至左下角 s.push(root); root = root->lc; } if (!s.empty()) { root = s.top();//备份当前栈顶地址 s.pop(); cout << root->data << " "; root = root->rc; } }}
后序遍历:
次序为:left,right,root。
//非递归后序遍历二叉树void postorder(NODE *t) { if (t == NULL) return; NODE *pr = NULL, *root = t; stack<NODE *>s; while (root != NULL || !s.empty()) { while (root != NULL) { //一路直走至左下角 s.push(root); root = root->lc; } root = s.top(); //右子树为空或者已访问,输出当前节点 if (root->rc == NULL || root->rc == pr) { cout << root->data << ends; pr = root;//将当前结点地址赋值rootre作为下一次判断标志,防止重复访问 s.pop(); root = NULL;//root赋值空以便访问右子树 } else { root = root->rc;//访问子树的右子树 } }}
完整代码 :
#include<iostream>#include<algorithm>#include<stack>using namespace std;typedef char A;typedef struct node{ A data; struct node *lc,*rc;}NODE;NODE* buildtree(){ A a; cin>>a; if(a=='#')return NULL; NODE *p = new node; p->data = a; p->lc = buildtree(); p->rc = buildtree(); return p; }//非递归前序遍历二叉树void preorder(NODE *t) { if (t == NULL) return; stack<NODE *> s; s.push(t); while (!s.empty()) { NODE *root = s.top();//赋值一份当前双亲节点 cout << root->data <<" "; s.pop(); //先存储右子树,确保先输出左子树 if (root->rc) s.push(root->rc); //后存储左子树 if (root->lc) s.push(root->lc); }}//非递归中序遍历二叉树void inorder(NODE *t) { if (t == NULL) return; NODE *root = t; stack<NODE *>s; while (root != NULL || !s.empty()) { while (root != NULL) { //一路直走至左下角 s.push(root); root = root->lc; } if (!s.empty()) { root = s.top();//备份当前栈顶地址 s.pop(); cout << root->data << " "; root = root->rc; } }}//非递归后序遍历二叉树void postorder(NODE *t) { if (t == NULL) return; NODE *pr = NULL, *root = t; stack<NODE *>s; while (root != NULL || !s.empty()) { while (root != NULL) { //一路直走至左下角 s.push(root); root = root->lc; } root = s.top(); //右子树为空或者已访问,输出当前节点 if (root->rc == NULL || root->rc == pr) { cout << root->data << ends; pr = root;//将当前结点地址赋值rootre作为下一次判断标志,防止重复访问 s.pop(); root = NULL;//root赋值空以便访问右子树 } else { root = root->rc;//访问子树的右子树 } }}int main(){ NODE *root = NULL; root = buildtree(); cout<<"前序:"; preorder(root); cout<<endl<<"中序:"; inorder(root); cout<<endl<<"后序: "; postorder(root);}/*测试数据:DBA##C##EF##G##*/
阅读全文
0 0
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的递归遍历与非递归遍历
- 【数据结构】2.线性表
- 双指针常见用法2
- 【数据结构】3.栈与队列
- EditText内容格式化控件 XEditText 和 输入内容过滤器
- 01背包问题
- 二叉树的非递归遍历
- 图像分割—基于图的图像分割(Graph-BasedImageSegmentation)
- html label-标签
- 仿照DatePickerFragment实现的TimePickerFragment
- LeetCode 144: Binary Tree Preorder Traversal 解题与思考
- Qt的传统安装方法
- 【数据结构】4.串
- 动态规划系列---求数组中两个元素差的最大值
- ZigBee规范各层原语及其功能概述