Leetcode 889. 根据前序和后序遍历构造二叉树 construct-binary-tree-from-preorder-and-postorder-traversal
* 返回与给定的前序和后序遍历匹配的任何二叉树。
*
* pre 和 post 遍历中的值是不同的正整数。
* 示例:
*
* 输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
* 输出:[1,2,3,4,5,6,7]
* 提示:
*
*
* 1 <= pre.length == post.length <= 30
* pre[] 和 post[] 都是 1, 2, ..., pre.length 的排列
* 每个输入保证至少有一个答案。如果有多个答案,可以返回其中一个。
思路:labuladong
根据前序和后序无法得到唯一解,因为无法确定左右子树的位置。因此可以简单粗暴的选择左边第一个作为左子结点,然后在后序中查找这个结点来确定左子树的长度。这里需要注意,因为查找的是左子树的根节点,所以左子树长度为index-poststart+1
class Solution { public: TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) { TreeNode* root=build(preorder,0,preorder.size()-1, postorder,0,postorder.size()-1); return root; } TreeNode* build(vector<int>& preorder, int prestart, int preend, vector<int>& postorder, int poststart, int postend){ if(prestart>preend){ return nullptr; } if(prestart==preend){ return new TreeNode(preorder[prestart]); } int val=preorder[prestart]; int leftval=preorder[prestart+1]; int index=0; for(int i=poststart;i<postend;++i){ if(postorder[i]==leftval){ index=i; break; } } TreeNode* root=new TreeNode(val); int n=index-poststart+1; root->left=build(preorder,prestart+1,prestart+n,postorder,poststart,index); root->right=build(preorder,prestart+n+1,preend,postorder,index+1,postend-1); return root; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=