三种树遍历顺序的迭代版
2015-09-22 20:29
260 查看
前序:根、左、右
中序:左、根、右
后序:左、右、根
/** * 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> InorderOfPath; stack <TreeNode *> stack1; if(root!=NULL){ stack1.push(root); while(!stack1.empty()){ TreeNode * p=stack1.top(); stack1.pop(); InorderOfPath.push_back(p->val); if(p->right) stack1.push(p->right); if(p->left) stack1.push(p->left); } } return InorderOfPath; }
中序:左、根、右
vector<int> inorderTraversal(TreeNode *root) { vector<int> InorderPath; stack <TreeNode *> stack1; while(!stack1.empty() || root!=NULL){ while(root!=NULL){ stack1.push(root); root=root->left; } if(!stack1.empty()){ root=stack1.top(); stack1.pop(); InorderPath.push_back(root->val); root=root->right;//若存在右子树,则压栈进行遍历。若无,则跳过前一个while循环,直接进行弹栈操作 } } return InorderPath; }
后序:左、右、根
vector<int> postorderTraversal(TreeNode* root){ vector<int> path; stack<TreeNode *> stack1; TreeNode * cur; TreeNode * prev; cur=root; prev=NULL; while(cur){ stack1.push(cur); cur=cur->left; }//同样是遍历压栈到最左边的结点 while(!stack1.empty()){ cur=stack1.top(); stack1.pop(); if(cur->right==NULL || cur->right==prev){ //一个根结点被访问的前提是:无右子树或右子树已经遍历过了 path.push_back(cur->val); prev=cur; } else{ stack1.push(cur);//若结点有右子树,则应再把结点压回去,等右子树遍历完再遍历这个结点 //先进入右子树 cur=cur->right; while(cur){ stack1.push(cur); cur=cur->left; } } } return path; }
相关文章推荐
- 浅谈javascript 迭代方法
- 二叉树先根(先序)遍历的改进
- 二叉树遍历 非递归 C++实现代码
- php可应用于面包屑导航的迭代寻找家谱树实现方法
- JavaScript数组迭代器实例分析
- c++二叉树的几种遍历算法
- JS的数组迭代方法
- 二叉树先序遍历的非递归算法具体实现
- 跟老齐学Python之让人欢喜让人忧的迭代
- python使用三角迭代计算圆周率PI的方法
- Python迭代用法实例教程
- PHP SPL,被遗落的宝石
- javaWeb jstl的基本库的定义, 迭代循环, 条件判断
- 牛顿迭代法
- leetcode 虐我篇之(十四)Binary Tree Preorder Traversal
- leetcode 虐我篇之(十五)Binary Tree Inorder Traversal
- leetcode 虐我篇之(十六)Binary Tree Postorder Traversal
- 网格搜索 C++实现 机器暴力参数优化
- stm32f407使用OV7725使用迭代阈值法进行图像二值化,图像分割
- 简单迭代服务器端/客户端:模仿飞Q聊天功能,实现IM通信