二叉树的非递归遍历
2016-03-05 20:43
295 查看
二叉树的遍历
仅为自己提个醒,只因为它如此重要前序
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; } } }
层次遍历
层次遍历的应用版本一队列
版本二递归
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- php中使用key,value,current,next和prev函数遍历数组的方法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- 平衡二叉树