二叉树的遍历(递归与迭代)
来源:互联网 发布:java权限管理设计rbac 编辑:程序博客网 时间:2024/04/27 22:46
1、前序遍历
访问顺序:根->左子树->右子树
递归实现:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };**/ vector<int> preorderTraversal(TreeNode *root) { vector<int> v; vector<int> temp1; vector<int> temp2; vector<int>::iterator it; if(root!=NULL) { v.push_back(root->val); temp1=preorderTraversal(root->left); it=temp1.begin(); while(it!=temp1.end()) { v.push_back((*it)); it++; } temp2=preorderTraversal(root->right); it=temp2.begin(); while(it!=temp2.end()) { v.push_back((*it)); it++; } } return v; }
迭代实现:
利用栈作为辅助空间,回溯访问二叉树的节点
vector<int> preorderTraversal(TreeNode *root) { vector<int> v; stack<TreeNode *> s; TreeNode *p=root; while(p!=NULL||!s.empty()) { if(p!=NULL) { v.push_back(p->val);//visit(p->val); s.push(p); p=p->left; } else { p=s.top()->right; s.pop(); } } return v; }
2、中序遍历
访问顺序: 左子树->根节点->右子树
递归实现:
vector<int> inorderTraversal(TreeNode *root) { vector<int> v; vector<int>::iterator it; vector<int> temp1; vector<int> temp2; if(root!=NULL) { temp1=inorderTraversal(root->left); it=temp1.begin(); while(it!=temp1.end()) { v.push_back((*it)); it++; } v.push_back(root->val); temp2=inorderTraversal(root->right); it=temp2.begin(); while(it!=temp2.end()) { v.push_back((*it)); it++; } } return v; }
可以看出中序遍历和前序遍历十分相像。
迭代实现:
vector<int> inorderTraversal(TreeNode *root) { vector<int> v; stack<TreeNode *> s; TreeNode *p=root; while(p!=NULL||!s.empty()) { if(p!=NULL) { // v.push_back(p->val); s.push(p); p=p->left; } else { v.push_back((s.top())->val); p=s.top()->right; s.pop(); } } return v; }
3、后序遍历
访问顺序:左子树->右子树->根
递归实现:
vector<int> postorderTraversal(TreeNode *root) { vector<int> v; vector<int>::iterator it; vector<int> temp1; vector<int> temp2; //TreeNode *p=root; if(root!=NULL) { temp1=postorderTraversal(root->left); it=temp1.begin(); while(it!=temp1.end()) { v.push_back((*it)); it++; } temp2=postorderTraversal(root->right); it=temp2.begin(); while(it!=temp2.end()) { v.push_back((*it)); it++; } v.push_back(root->val); } return v; }
迭代实现:
参考:http://oj.leetcode.com/discuss/1514/accepted-but-my-solution-destroys-the-original-tree
vector<int> postorderTraversal(TreeNode *root) { vector<int> v; stack<TreeNode *> s; TreeNode *last=root; if(root==NULL) return v; s.push(root); while(!s.empty()) { TreeNode * cur=s.top(); //如果是叶子节点:cur->left==NULL&&cur->right==NULL,则打印 //如果cur节点的左右子树都被访问了:cur->right==last,则打印 //如果cur节点的左子树被访问了,而右子树为空:cur->left==last&&cur->right==NULL,则打印 if((cur->left==NULL&&cur->right==NULL)||cur->right==last||(cur->left==last&&cur->right==NULL)) { v.push_back(cur->val); last=cur; s.pop(); } else { if(cur->right!=NULL)//右子树先入栈,后访问 s.push(cur->right); if(cur->left!=NULL)//左子树后入栈,先访问 s.push(cur->left); } } return v; }
0 0
- 二叉树的遍历(递归与迭代)
- 二叉树遍历(递归与迭代)
- 二叉树遍历(递归与迭代)
- 二叉树遍历(递归与迭代) C++
- 二叉树的遍历(先序/中序/后序,递归/迭代)与搜索
- 二叉树的递归、迭代遍历的模板代码
- 二叉树非递归遍历--迭代
- 二叉树遍历的所有递归和迭代实现
- C++创建二叉树与遍历(递归与迭代)
- 数据结构与算法学习笔记——二叉树遍历(一)(递归、迭代)
- 二叉树的3中遍历方法(递归和迭代)
- 二叉树的四种遍历方法(递归、迭代)
- 二叉树三种遍历的递归和迭代解法
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 二叉树的遍历(递归与非递归)
- 二叉树的遍历算法(递归与非递归)
- 二叉树的遍历(递归与非递归)
- 二叉树的遍历(递归与非递归)
- sql语句在sql server中查询每个表的记录数,占用的空间,索引占用的空间等
- java:浅谈数组与对象的内存控制
- 7-2 多线程练习-——卖票程序(方法二)
- js live方法
- 编程珠玑笔记第一章
- 二叉树的遍历(递归与迭代)
- linux定时执行脚本
- 根据屏幕动态设置view的宽度 DisplayMetrics dip2px
- InStallShield 检测dotnet2.0
- Memcached缓存大数据时对服务器内存、CPU的影响及其对硬件的配置需求
- 程序员每天该做的事
- 完美的DialogBar
- 习近平谈秘书工作
- [LeetCode] Restore IP Addresses