[leetcode]105.从前序与中序遍历序列构造二叉树

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

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

例如,给出

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

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

思路:
二叉树的根节点是先序遍历的头节点,保存,再中序序列中找见对应的位置,该位置将中序序列一分为2,左边为左子树,右边为右子树,然后递归建立左子树,右子树即可。

AC代码:(C++)

class Solution {
   public:
    TreeNode* build(vector<int>& preorder, vector<int>& inorder, int preL,
                    int preR, int inL, int inR) {
        if (preL > preR) return NULL;  //先序序列长度小于等于0时,直接返回
        int temp = preorder[preL];  //先序遍历第一个节点为头节点
        TreeNode* node = new TreeNode(temp);  //建立新节点
        int k;  //头节点在中序遍历序列中的位置
        for (k = inL; k <= inR; k++) {
            if (inorder[k] == temp) break;
        }
        int num = k - inL;  //左子树元素的个数
        node->left = build(preorder, inorder, preL + 1, preL + num, inL, k - 1);
        node->right =
            build(preorder, inorder, preL + num + 1, preR, k + 1, inR);
        return node;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int preL = 0, preR = preorder.size() - 1, inL = 0,
            inR = inorder.size() - 1;
        return build(preorder, inorder, preL, preR, inL, inR);
    }
};

你可能感兴趣的:(LeetCode)