通过二叉树的中序和后序遍历序列构造二叉树(非递归)
2014-05-10 19:55
429 查看
题目:通过二叉树的中序和后序遍历序列构造二叉树
同样,使用分治法来实现是完全可以的,可是在LeetCode中运行这种方法的代码,总是会报错:
,所以这里还是用栈来实现二叉树的构建。
与用先序和后序遍历构造二叉树的方法类似,但还是要做一些改变:
如果从后往前处理中序和后序的序列,则处理就为如下所示的情况:
Reverse_Post: 根—右子树—左子树
Reverse_In: 右子树—根—左子树
这样处理方式和先序—中序就差不多了,只是将添加左孩子的情况,改为添加右孩子,反之依然。
实现代码如下所示:
同样,使用分治法来实现是完全可以的,可是在LeetCode中运行这种方法的代码,总是会报错:
Memory Limit Exceeded
,所以这里还是用栈来实现二叉树的构建。与用先序和后序遍历构造二叉树的方法类似,但还是要做一些改变:
如果从后往前处理中序和后序的序列,则处理就为如下所示的情况:
Reverse_Post: 根—右子树—左子树
Reverse_In: 右子树—根—左子树
这样处理方式和先序—中序就差不多了,只是将添加左孩子的情况,改为添加右孩子,反之依然。
实现代码如下所示:
TreeNode *buildTree_in_post(vector<int> &inorder, vector<int> &postorder) { stack<TreeNode *> s; int len = (int) inorder.size(); if(len == 0) return NULL; int in_ptr, post_ptr;//分别用于对中序和后序处理 in_ptr = post_ptr = len-1;//从序列最后一个元素往前进行处理 TreeNode* root = new TreeNode(postorder[post_ptr]);//构造根结点,后序遍历最后一个元素为根结点的值 TreeNode* pCur = root;//用于保存树当前处理结点 int flag = 0;//用于决定是否构造左结点 post_ptr--; s.push(root); while(post_ptr > -1)//处理到pOstorder[0] { if(!s.empty() && s.top()->val == inorder[in_ptr]) { pCur = s.top(); s.pop(); in_ptr--; flag = 1; } else { if(flag == 1)//构造左结点 { pCur->left = new TreeNode(postorder[post_ptr]); pCur = pCur->left; s.push(pCur); post_ptr--; flag = 0; } else//构造右结点 { pCur->right = new TreeNode(postorder[post_ptr]); pCur = pCur->right; s.push(pCur); post_ptr--; } } } return root; }
相关文章推荐
- 通过树的先序和中序遍历序列来构造二叉树
- 输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树的二叉链表。 (2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。 (3)写出
- 二叉树先序,中序,后序遍历非递归实现
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 二叉树前序、中序、后序非递归遍历
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
- 通过先序遍历和中序遍历后的序列还原二叉树(实现方法)
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 旧话重提,根据先序和中序遍历构造二叉树并后序遍历验证之
- 二叉树中先序、中序、后序遍历序列
- [转]非递归实现二叉树的前序,中序,后序遍历
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 二叉树的先序-中序-后序遍历(一)-递归
- 二叉树的前序,中序,后序遍历 递归实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的前序、中序、后序遍历的非递归方法 python
- 二叉树前序、中序、后序非递归遍历实现(C语言)
- 递归创建二叉树,前序,中序,后序遍历二叉树,广义表创建二叉树,非递归前序,中序,后序遍历二叉树