105. Construct Binary Tree from Preorder and Inorder Traversal && 面试题07. 重建二叉树

Problem

Given preorder and inorder traversal of a tree, construct the binary tree.

Example

For example, given

preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]

return the following binary tree
在这里插入图片描述

Solution

前序遍历的第一个元素就是整棵树的根。
在中序遍历序列中,位于根元素左侧的就是左子树的前序遍历序列,根元素右侧的就是右子树的前序遍历序列。
根据中序遍历,得到左右子树各自的元素个数,然后从整棵树的前序遍历先取出左子树的前序遍历序列,再取出右子树的前序遍历序列。
这样就可以递归构建左右子树了。

注意stl算法find,copy和back_inserter的使用。

/**
 * 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:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty())
            return NULL;
        TreeNode *root = new TreeNode(preorder[0]);

        vector<int>::iterator it;
        it = find (inorder.begin(), inorder.end(), preorder[0]);

        vector<int> left_inorder;
        vector<int> right_inorder;
        copy(inorder.begin(),it,back_inserter(left_inorder));
        copy(++it,inorder.end(),back_inserter(right_inorder));

        vector<int> left_preorder;
        vector<int> right_preorder;

        copy(preorder.begin()+1,preorder.begin()+1 + left_inorder.size(),back_inserter(left_preorder));
        copy(preorder.begin()+1 + left_inorder.size(),preorder.end(),back_inserter(right_preorder));

        root->left = buildTree(left_preorder,left_inorder);
        root->right = buildTree(right_preorder,right_inorder);

        return root;

    }
};
发布了496 篇原创文章 · 获赞 215 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/sjt091110317/article/details/104683962