二叉树的非递归前序、中序、后序遍历
来源:互联网 发布:剑灵灵族男捏脸数据吧 编辑:程序博客网 时间:2024/06/03 10:19
递归的前序、中序、后序遍历与概念基本一致,简单明了。而非递归遍历稍微麻烦,确实最容易被问到的东西。
首先看非递归前序遍历:用栈实现,先访问根节点,然后压入右子树,再压入左子树。
Binary Tree Preorder Traversal
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int> preorderTraversal(TreeNode *root) { vector<int> ret; stack<TreeNode*> s; if(root!=NULL){ s.push(root); while(!s.empty()){ root=s.top(); s.pop(); ret.push_back(root->val); if(root->right!=NULL){ s.push(root->right); } if(root->left!=NULL){ s.push(root->left); } } } return ret; }};
中序遍历非递归实现:将左子树一直压栈,直到左子树为空,然后取栈顶元素,访问栈顶元素,并访问其右子树。
Binary Tree Inorder Traversal
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int> inorderTraversal(TreeNode *root) { vector<int> ret; stack<TreeNode*> s; TreeNode *pRoot=root; while(pRoot!=NULL||!s.empty()){ while(pRoot!=NULL){ s.push(pRoot); pRoot=pRoot->left; } if(!s.empty()){ pRoot=s.top(); ret.push_back(pRoot->val); s.pop(); pRoot=pRoot->right; } } return ret; }};
后序非递归遍历:
这里参考了一个网上的容易理解的方法:对于任一节点,将其入栈,如果该节点没有左子树和右子树或者其左孩子和右孩子已经被访问过,则可访问该节点。否则,将该节点的右子树压栈,将该节点的左子树压栈。
Binary Tree Postorder Traversal
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int> postorderTraversal(TreeNode *root) { vector<int> result; stack<TreeNode*> s; TreeNode *cur=NULL,*pre=NULL; if(root==NULL){ return result; } s.push(root); while(!s.empty()){ cur=s.top(); if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&cur->left==pre)||(pre!=NULL&&cur->right==pre)){ result.push_back(cur->val); s.pop(); pre=cur; } else{ if(cur->right!=NULL){ s.push(cur->right); } if(cur->left!=NULL){ s.push(cur->left); } } } return result; }};
0 0
- 二叉树的非递归【前/中/后 序遍历】
- 前,中,后序遍历二叉树 (递归 && 非递归的栈 && 非递归非栈的线索二叉树)
- 【二叉树】 前序、中序和后序的递归遍历与非递归遍历
- 二叉树非递归前、中、后序遍历
- 二叉树非递归前、中、后序遍历实现
- 非递归前,中,后序遍历二叉树
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树的非递归前序、后序遍历
- 二叉树的前序,中序,后序的递归与非递归遍历
- 【二叉树】实现二叉树的前序、中序、后序的非递归遍历
- 二叉树的创建,遍历(前序,中序,后序)-递归 非递归
- 二叉树的前序、中序、后序遍历 递归非递归实现
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的递归和非递归遍历(前序、中序、后序)
- 二叉树的前序、中序、后序遍历(递归&非递归)
- 二叉树的前序、中序、后序遍历(递归与非递归)
- 二叉树的前序,中序,后序遍历(递归非递归实现)
- 利用jquery-latest.js实现合并table多列重复行
- 第三周作业
- js javascript:void(0) 真正含义(转)
- 一种nfc蓝牙设备及其配对方法和制造方法
- random.nextInt() random.nextDouble()
- 二叉树的非递归前序、中序、后序遍历
- FreeSwitch控制台常用命令(来自freeswitch中文wiki)
- HDOJ-1533 二分图最佳完美匹配通俗解释
- android中Activity之间跳转信息传递
- 学习JS不错的网站(纯收集)
- 联合(union)用法
- NIOS2 uCLinux-mmu 驱动之hello_world
- AIX6.1安装SSH
- poj2653(判断两线段相交)