二叉树专题-根据前序和中序序列构造二叉树

经典的二叉树构造的问题,例子:(注意题目中限定了,没有重复的元素),先序为2143,中序为1423

我们先手算一下,看看是如何构造的。先序第一个为2,则根为2,那么去中序中找2,就能够区分左右子树了。14在左子树,3在右子树。且左子树的先序序列为14,中序也为14.....可以分析出来这是一个递归的过程。手工算到最后,很容易构造出二叉树。

二叉树专题-根据前序和中序序列构造二叉树_第1张图片

故递归函数必须要有preL,preR,inL,inR这些参数,作为当前的先序中序序列的左右区间。先根据先序第一个值找到根,再去中序中找相等的值(假设下标为k),区分左右子树即可,关键是要计算正确左右子树的范围。左子树的节点数numLeft=k-inL

一般性的过程如下,inL,inR,preL,preR均为数组下标

二叉树专题-根据前序和中序序列构造二叉树_第2张图片

推到这里了,很容易写出代码:

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
 

class Solution {
    /**
     *@param preorder : A list of integers that preorder traversal of a tree
     *@param inorder : A list of integers that inorder traversal of a tree
     *@return : Root of a tree
     */
public:
    TreeNode *buildTree(vector &preorder, vector &inorder) {
        // write your code here
        if(preorder.empty()||inorder.empty())
        return NULL;
        return build(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
    }
    TreeNode* build(vector preorder,vector inorder,int preL,int preR,int inL,int inR){
        if(preL>preR)//终止条件
        return NULL;
        int rootValue=preorder[preL];//先序第一个值即为根的值
        TreeNode* root=new TreeNode(rootValue);
        //寻找左右子树的划分
        int k;
        for(int i=0;ileft=build(preorder,inorder,preL+1,preL+numLeft,inL,k-1);
        root->right=build(preorder,inorder,preL+numLeft+1,preR,k+1,inR);
        return root;
    }
};


你可能感兴趣的:(数据结构,lintcode题解)