從前序與中序構造二叉樹

Old Tony發表於2020-11-14

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意:
你可以假設樹中沒有重複的元素。

例如,給出

前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:

3

/
9 20
/
15 7

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

思路:前序遍歷構造順序:根左右
中序:左根右
找到左子節點和右子節點對應的下標

/**
 * 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:
    map<int,int>index;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n=preorder.size();
        //使用中序遍歷來構造雜湊表,方便尋找根節點的值
        for(int i=0;i<n;i++)
        {  
            index[inorder[i]]=i;
        }
        return myBuildTree(preorder,inorder,0,n-1,0,n-1);
    }
    TreeNode* myBuildTree(vector<int>& preorder,vector<int>& inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right)
    {
        if(preorder_left>preorder_right)
        return nullptr;
        //前序遍歷第一個節點就是根節點
        int preorder_root=preorder_left;
        //在中序遍歷中定位根節點
        int inorder_root=index[preorder[preorder_root]];
        //先把根節點建立出來
        TreeNode *root=new TreeNode(preorder[preorder_root]);
        //得到左子樹中的節點數目
        int size_left=inorder_root-inorder_left;
        //preorder_left+1 前序遍歷左節點元素位置左半部分,preorder_left+size_left右半部分//,inorder_left在中序遍歷元素的位置左邊界,inorder_root-1右邊界
        root->left=myBuildTree(preorder,inorder,preorder_left+1,preorder_left+size_left,inorder_left,inorder_root-1);
        root->right=myBuildTree(preorder,inorder,preorder_left+size_left+1,preorder_right,inorder_root+1,inorder_root);
        return root;
    }
};

相關文章