利用中序和后序遍历还原二叉树
2018-03-28 21:29
555 查看
题目描述
Given inorder and postorder traversal of a tree, construct the binary tree.Note:
You may assume that duplicates do not exist in the tree.
实现代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
return helper(inorder, inorder.begin(), inorder.end(), postorder, postorder.begin(), postorder.end());
}
TreeNode *helper(vector<int>& inorder, vector<int>::iterator begin1, vector<int>::iterator end1,vector<int>& postorder, vector<int>::iterator begin2, vector<int>::iterator end2)
{
if (begin1>=end1 || begin2>=end2)
return 0;
//取后序遍历的最后一个节点构建根节点
int value = *(end2-1);
TreeNode *pNode = new TreeNode(value);
//在中序遍历中,根左边的为左子树节点的中序遍历,右边为右子树节点的中序遍历
vector<int>::iterator it = find(begin1, end1, value);
int leftLength = it - begin1;
//在后序遍历中,除最后一个元素,及根外,前leftLength个节点为左子树的后序遍历,然后是右子树的后序遍历
//通过左子树的后序、中序遍历递归构建左子树
pNode->left = helper(inorder, begin1, it,postorder, begin2, begin2+leftLength);
//通过右子树的后序、中序遍历递归构建右子树
pNode->right = helper(inorder, it+1, end1,postorder, begin2+leftLength, end2-1);
return pNode;
}
};
相关文章推荐
- L2-006. 树的遍历(利用后序中序还原二叉树)
- 二叉树的创建以及利用迭代实现中序、先序、后序遍历、清空
- 二叉树的创建以及利用迭代实现中序、先序、后序遍历、清空
- 数据结构基础 后序遍历和中序遍历还原二叉树
- L2-006. 树的遍历(利用后序中序还原二叉树)
- 数据结构基础 后序遍历和中序遍历还原二叉树
- hdu1710 已知二叉树的前序遍历和中序遍历,还原二叉树,求出后序、层次遍历
- 如何根据前序、中序、后序遍历还原二叉树
- 已知二叉树的先序遍历(preorder)和中序遍历(inorder) 或 中序和后序(postorder),还原该二叉树
- 利用栈实现二叉树的先序,中序,后序遍历的非递归操作
- LeetCode-106:Construct Binary Tree from Inorder and Postorder Traversal (利用中序和后序遍历构建二叉树) -- medium
- 如何根据前序、中序、后序遍历还原二叉树
- 利用先序和中序非递归恢复二叉树,并后序遍历输出
- 利用前序遍历和中序遍历还原二叉树以及涉及的分治法思想
- php实现先序、中序、后序遍历二叉树
- 二叉树前序、中序、后序遍历相互求法
- 二叉树 中序+后序->还原二叉树
- 利用二叉树中序及后序遍历确定该二叉树的先序序列(0983)
- 通过先序遍历和中序遍历后的序列还原二叉树(实现方法)
- 根据前序遍历和中序遍历构建二叉树以及根据中序遍历后序遍历构建二叉树