leetcode105——Construct Binary Tree from Preorder and Inorder Traversal

题目大意:根据所给的前序和中序遍历的二叉树序列构建出二叉树

分析:dfs。由于前序遍历时的第一个结点就是根节点,在中序遍历的序列中位于根节点左侧的就是左子树,右侧的就是右子树,所以可以递归建树

代码:

/**
 * Definition for binary tree
 * 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) {
        return Helper(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
    }
    
    TreeNode* Helper(vector<int> &preorder, int begin1, int end1, vector<int> &inorder, int begin2, int end2) {
        if(begin1 > end1)
            return NULL;
        else if(begin1 == end1)
            return new TreeNode(preorder[begin1]);
        TreeNode* root = new TreeNode(preorder[begin1]);
        int i;
        for(i = begin2; i <= end2; i ++) {  //在中序序列中找到根节点的索引i
            if(inorder[i] == preorder[begin1])
                break;
        }
        int leftlen = i-begin2;  //中序序列左侧的结点个数(左子树节点个数)
        root->left = Helper(preorder, begin1+1, begin1+leftlen, inorder, begin2, i - 1);
        root->right = Helper(preorder, begin1+leftlen+1, end1, inorder, i + 1, end2);
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/tzyshiwolaogongya/article/details/81190160