您的位置:首页 > 其它

根据两种不同遍历结果重构二叉树

2016-10-08 10:42 585 查看
leetcode原题:题目1 题目2

这里假设给的遍历都有中序遍历,我们先根据先序遍历或后序遍历找到根结点的值,然后据此可判断,在中序遍历的结果向量中,在根节点之前的部分数组组成它的左子树,根节点之后组成它的右子数。采用深度递归dfs。

题1:已知中序和后序遍历结果

/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
TreeNode* dfs(int post, int instart, int inend,vector<int>& inorder, vector<int>& postorder)
{
if(post<0||instart>inend)
return NULL;
TreeNode* root=new TreeNode(postorder[post]);
int index=0;
for(int i=instart;i<=inend;i++)
if(inorder[i]==postorder[post])
{
index=i;
break;
}
TreeNode* left=dfs(post-(inend-index)-1,instart,index-1,inorder,postorder);
TreeNode* right=dfs(post-1,index+1,inend,inorder,postorder);
root->left=left;
root->right=right;
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int n=postorder.size();
return dfs(n-1,0,n-1,inorder,postorder);
}
};


题2:已知中序和前序遍历结果

/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
TreeNode * dfs(int preStart, int inStart, int inEnd, vector<int>& preorder, vector<int>& inorder)
{
if(preStart>preorder.size()-1||inStart>inEnd)
return NULL;
TreeNode* root=new TreeNode(preorder[preStart]);
int index=0;
for(int i=inStart;i<=inEnd;i++)
if(inorder[i]==preorder[preStart])
{ index=i;break;}
TreeNode* left=dfs(preStart+1,inStart,index-1,preorder,inorder);
TreeNode* right=dfs(preStart+index-inStart+1,index+1,inEnd,preorder,inorder);
root->left=left;
root->right=right;
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return dfs(0,0,inorder.size()-1,preorder,inorder);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: