二叉树遍历 递归与非递归 先序-中序-后序
来源:互联网 发布:怎样使用办公软件 编辑:程序博客网 时间:2024/05/29 13:56
序
题目:
分别用递归和非递归的方式实现二叉树先序、中序、后序遍历!
二叉树节点结构
struct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int v) :val(v), left(NULL), right(NULL){}};
先序遍历
递归实现
/*递归先序遍历*/void preOrderRecur(TreeNode *tree){if (!tree)return;cout << tree->val << "\t";preOrderRecur(tree->left);preOrderRecur(tree->right);}
非递归实现
/*非递归实现先序遍历*/void preOrderUnRecur(TreeNode *tree){if (!tree)return;stack<TreeNode *> stk;/*压入根节点*/stk.push(tree);while (!stk.empty()){TreeNode *tmp = stk.top();cout << tmp->val << "\t";stk.pop();/*先压入栈右子树节点,再压入栈左子树节点*/if (tmp->right)stk.push(tmp->right);if (tmp->left)stk.push(tmp->left);}//while}
中序遍历
递归实现
/*递归实现中序遍历*/void inOrderRecur(TreeNode *tree){if (!tree)return;inOrderRecur(tree->left);cout << tree->val << "\t";inOrderRecur(tree->right);}
非递归实现
/*非递归实现中序遍历*/void inOrderUnRecur(TreeNode *tree){if (!tree)return;stack<TreeNode *> stk;TreeNode *cur = tree;while (!stk.empty() || cur){if (cur){stk.push(cur);cur = cur->left;}//ifelse{cur = stk.top();stk.pop();cout << cur->val << "\t";cur = cur->right;}//else}//while}
后序遍历
递归实现
/*递归实现后序遍历*/void postOrderRecur(TreeNode *tree){if (!tree)return;postOrderRecur(tree->left);postOrderRecur(tree->right);cout << tree->val << "\t";}
非递归实现1
/*非递归实现后序遍历1*/void postOrderRecur1(TreeNode *tree){if (!tree)return;/*两个辅助栈*/stack<TreeNode *> stk1;stack<TreeNode *> stk2;stk1.push(tree);while (!stk1.empty()){TreeNode *tmp = stk1.top();stk1.pop();if (tmp->left)stk1.push(tmp->left);if (tmp->right)stk1.push(tmp->right);stk2.push(tmp);}//whilewhile (!stk2.empty()){cout << stk2.top()->val << "\t";stk2.pop();}//while}
非递归实现方式2
/*非递归实现后序遍历2*/void postOrderRecur2(TreeNode *h){if (!h)return;/*实现过程中,h代表最近一次弹出并打印的节点*/stack<TreeNode *> stk;stk.push(h);TreeNode *tmp;while (!stk.empty()){/*tmp代表栈顶节点*/tmp = stk.top();if (tmp->left && h != tmp->left && h != tmp->right){stk.push(tmp->left);}//elseelse if (tmp->right && h != tmp->right){stk.push(tmp->right);}//elifelse{cout << tmp->val << "\t";stk.pop();h = tmp;}//else}//while}
完整程序GitHub网址
1 0
- 二叉树遍历 递归与非递归 先序-中序-后序
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 二叉树2:层次遍历方式及先序、中序、后序(递归与非递归)遍历方式
- 二叉树 非递归 先序遍历 中序遍历 后序遍历 层次遍历
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- 二叉树的遍历 中序 后序 先序 递归 非递归
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的创建和先序,中序,后序,递归,非递归遍历
- 二叉树非递归和递归遍历(先序,中序,后序)
- 二叉树创建、删除、(递归/非递归)先序(中序/后序)遍历
- 二叉树的遍历 先序 中序 后序 递归非递归
- 二叉树的先序、中序、后序遍历(递归 and 非递归)
- 二叉树 先、中、后序递归和非递归遍历
- 非递归先序遍历二叉树、非递归中序遍历二叉树、非递归后序遍历二叉树
- 二叉树的先序、中序、后序遍历方法(递归与非递归方法)——《数据结构》
- 二叉树的先序、中序以及后序遍历(递归与非递归方法)
- 为什么一个垃圾深搜会搞了我一两天。。。。POJ-1321-棋盘问题
- jquery插件编写学习
- zookeeper原理(转)
- OTA升级总结
- xtu1038括号编码+栈
- 二叉树遍历 递归与非递归 先序-中序-后序
- Tomcat的HTTPS的配置
- nand flash与烧录器
- 九度题目1126
- 【bzoj3398】[Usaco2009 Feb]Bullcow 牡牛和牝牛 dp
- P_sensor 距离感应器 阈值如何设置
- php版WSDL、SOAP封装库
- Struts项目环境配置
- 网站开发进阶(三十一)js如何将html表格导出为excel文件(后记)