二叉树的递归非递归实现的中序遍历
2018-01-24 19:30
260 查看
和前序遍历类似这次我们不引入多叉树的概念(因为你不能判断你在哪个中间不像二叉树,所以不引入多叉树的的中序遍历)
首先定义树的结构
接着说递归的实现
接着就是非递归的实现我们先说一种互联网上比较少见的思路来引导一下
就是hash+stack的方法
观察规律每次都是先往左子树递归,并且最先访问最左边的树,那么我们先把左子树推入栈中,然后当没有左子树的打印节点,但是这样有个问题–那便是当我回到根节点后仍然会把之前推进栈的节点继续推进栈-从而导致死循环所以我们加入哈希来判断之前的点是否已经打印了
最后说一下只用栈的实现,实际基本思路不变但是确实不是特别好想
首先定义树的结构
struct TreeNode { int val ; TreeNode *left; TreeNode *right ; TreeNode( int _val ){ val = _val; left= NULL ; right= NULL ; } };
接着说递归的实现
void dfs( TreeNode * root ){ if( root == NULL) return ; dfs( root ->left ); cout << root->val <<endl; dfs( root->right ); }
接着就是非递归的实现我们先说一种互联网上比较少见的思路来引导一下
就是hash+stack的方法
观察规律每次都是先往左子树递归,并且最先访问最左边的树,那么我们先把左子树推入栈中,然后当没有左子树的打印节点,但是这样有个问题–那便是当我回到根节点后仍然会把之前推进栈的节点继续推进栈-从而导致死循环所以我们加入哈希来判断之前的点是否已经打印了
vector<int> inorderTraversal(TreeNode* root) { vector<int> ans ; if( root == NULL ) return ans ; stack<TreeNode *> slist ; map< TreeNode *, int > hash ; //hash可能会冲突可以随便改个名 slist.push( root ) ; while( slist.size() ){ TreeNode *top = slist.top() ; while( top->left && hash[top->left] == 0 ){ slist.push(top->left); top = top->left ; } ans.push_back(top->val); hash[top]++; slist.pop(); if( top-> right ){ slist.push(top->right ) ; } } return ans ; }
最后说一下只用栈的实现,实际基本思路不变但是确实不是特别好想
vector<int> inorderTraversal(TreeNode* root) { vector<int> ans ; if( root == NULL ) return ans ; stack<TreeNode *> slist ; TreeNode *cur = root ; while( cur != NULL || slist.size() ){ while( cur != NULL ){ slist.push( cur ) ; cur = cur->left ; } cur = slist.top(); slist.pop(); ans.push_back( cur->val ) ; cur = cur -> right ; } return ans ; }
相关文章推荐
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 不使用递归和栈实现二叉树的中序遍历
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树基础之前序遍历、中序遍历、后序遍历的递归和非递归实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 递归实现和非递归实现中序遍历二叉树
- 二叉树的先序遍历、中序遍历、后序遍历、层次遍历的递归实现
- 利用非递归方法实现二叉树的中序遍历
- 算法导论第十章习题10.4-3非递归方式实现二叉树的中序遍历
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 14.二叉树 中序遍历 先序遍历 的非递归实现 以及 二叉树 的复制 及判断二叉树的等价性
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- C++实现二叉树 前序遍历, 后序遍历, 中序遍历, 层序遍历(不用递归)
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树经典面试题解析一:用非递归实现二叉树的前序遍历,中序遍历,后序遍历
- 二叉树(2)----中序遍历,递归和非递归实现
- 二叉树之中序遍历的递归和迭代实现