重建二叉树

总结:

1.通过画图找到规律:

  1.1先序遍历的第一个元素是根结点。

  1.2.通过中序遍历找到左子树元素数目。

2.注意边界条件,如树为空的情况。

3.第二中解法一开始想不到递归出口,画完图明白了,一定要画图画图画图!

4.可以通过逐段注释的方式,定位bug。

5.第二中解法一直找不到bug,重新写了一遍,没问题了2333333

 

下面是两种解法:

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 {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        TreeNode * root = new TreeNode; 
        if(preorder.size()==0)
            return NULL;
        root->val = preorder[0];
        int num =0;
        int len = preorder.size();
        int i =0;
        while(inorder[i] !=  preorder[0])
        {
            num++;
            i++;
        }
        vector<int> lpre(preorder.begin()+1,preorder.begin()+1+num);
        vector<int> lin(inorder.begin(),inorder.begin()+num);
        root->left = buildTree(lpre,lin);

        vector<int>rpre(preorder.begin()+1+num,preorder.end());
        vector<int>rin(inorder.begin()+num+1,inorder.end());
        root->right = buildTree(rpre,rin);

        return root;
    }
};

 

2.优化的解法

1.通过哈希快速定位根结点位置,中序遍历中元素的值作为【键】,下标作为【值】

2.不需要每次都重新开辟数组来存放子树的先序中序表,可以通过指定起始点来再原始表中定位子树的表。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 private:
12     unordered_map<int,int> index;
13 public:
14     TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
15         int len = preorder.size();
16         for(int i =0;i<len;i++)
17             index[inorder[i]] = i;
18         if(len == 0)
19             return NULL;
20         else
21             return build(preorder,inorder,0,len-1,0,len-1);
22     }
23     TreeNode * build(vector<int>& preorder,vector<int>& inorder,int pre_begin,int pre_end,int in_begin,int in_end)
24     {
25         TreeNode * root = new TreeNode;
26         root->val = preorder[pre_begin];
27         int root_pos = index[root->val];
28         //left subtree size
29         int num = root_pos - in_begin;
30         
31         if(num != 0)
32             root->left = build(preorder,inorder,pre_begin+1,pre_begin + num,in_begin,root_pos-1);
33         else 
34             root->left = NULL;
35         
36         
37         if( (pre_end - pre_begin + 1 - num -1) != 0)
38             root->right = build(preorder,inorder,pre_begin+num+1,pre_end,root_pos+1,in_end);
39         else 
40             root->right =  NULL;
41             
42         
43         return root;
44     }
45 };

 

posted @ 2022-01-12 10:20  BohrCh  阅读(39)  评论(0)    收藏  举报