Leetcode 105. 从前序与中序遍历序列构造二叉树 C++

Leetcode 105. 从前序与中序遍历序列构造二叉树

题目

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

测试样例

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

题解

根据先序遍历的顺序为中左右,可以知道序列的第一个节点一定是根节点。再根据中序遍历的顺序左中右,以及确定的根节点的值,就可以知道左子树、右子树在数组的位置范围。因此,我们只需要根据位置范围递归生成左子树和右子树。详细过程见代码

代码

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty())    return nullptr;
        TreeNode *root = new TreeNode(preorder[0]);			//先序序列的第一个节点是根节点
        int i,n=inorder.size();
        for(i=0; i<n; i++)  
            if(inorder[i]==preorder[0]) break;		//根据中序序列确定左子树、右子树的位置
        vector<int> left(preorder.begin()+1,preorder.begin()+i+1);
        vector<int> right(preorder.begin()+i+1,preorder.end());
        vector<int> leftIn(inorder.begin(),inorder.begin()+i);
        vector<int> rightIn(inorder.begin()+i+1,inorder.end());
        root->left = buildTree(left,leftIn);
        root->right = buildTree(right,rightIn);
        return root;
    }

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(Leetcode 105. 从前序与中序遍历序列构造二叉树 C++)