二叉树的非递归遍历
来源:互联网 发布:mac 修复flash 插件 编辑:程序博客网 时间:2024/04/29 15:56
二叉树的遍历
仅为自己提个醒,只因为它如此重要
前序
void preorderTraversal(TreeNode* root) { stack<TreeNode*> st; TreeNode* p = root; while (p || !st.empty()){ if (p){ cout << p->val << " ";//先访问节点,再压栈 st.push(p); p = p->left; } else{ p = st.top(); st.pop(); p = p->right; } }}
中序
void inorderTraversal(TreeNode* root) { stack<TreeNode*> st; TreeNode* p = root; while (p || !st.empty()){ if (p){ st.push(p);//先压栈 p = p->left; } else{ p = st.top(); st.pop(); cout << p->val << " ";//再访问 p = p->right; } }}
后序
版本一:双栈
void postorderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> st,sr; //st 辅助栈,sr 存放逆序的栈 st.push(root); while (!st.empty()){ TreeNode* p = st.top(); st.pop(); sr.push(p); //根进入栈 if (p->left){ st.push(p->left); //左子树先进入st,后出栈,后进sr栈 } if (p->right){ st.push(p->right); //右子树后进入st,先出栈,先进sr栈 } } //------------------------->//在sr栈中的顺序为:根,右,左。 while (!sr.empty()){ cout << sr.top()->val << " "; sr.pop(); }}
版本二:单栈
void postorderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s ; TreeNode* cur = root; TreeNode* pre = NULL; while (cur || !s.empty()) { while (cur)//当前结点的最“左下”节点 { s.push(cur); cur = cur->left; } cur = s.top(); if (cur->right == NULL || cur->right == pre){//当前结点没有右子树or当前结点的右子树已经访问过了 s.pop(); cout << cur->val << " "; pre = cur; cur = NULL; } else{ cur = cur->right; } }}
层次遍历
层次遍历的应用
版本一队列
版本二递归
0 0
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的递归遍历与非递归遍历
- OwlCarousel演示10种不同的调用方法
- 模拟省赛的感想
- 离散傅里叶变换
- 安捷伦设备编程
- 广搜——三个水杯
- 二叉树的非递归遍历
- 怎么获取并设置鼠标位置
- 使用modelDriven的好处及原理
- ZOJ-1045
- 1104. Sum of Number Segments (20)
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
- 微信红包接口API实现(php版)
- AS导入外部项目
- 实现水波效果