剑指offer——4.重建二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/N1neDing/article/details/81843330

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

解题思路:

前序遍历第一个数字为根节点的值,为1,据此判断出中序遍历中根节1左边的序列472为左子树的中序遍历,前序遍历根节点1右方相同个数的节点247为左子树的前序遍历,所以5386为右子树的中序遍历,3568位右子树的前序遍历。然后再分别对左右子树的前序遍历序列和中序遍历序列进行相同的操作,将大问题化解为小问题,很容易想到本题的解法为递归。

参考源码:

class Solution {
public:
    TreeNode * reConstructBinaryTree(vector<int> pre, vector<int> vin)
    {
        TreeNode* root = NULL;
        if (pre.size() == 0) return root;
 
        root = new TreeNode(pre.front());
        int num_left = 0;
        for (int i = 0; i < vin.size(); i++)
        {
            if (vin[i] == pre.front())
            {
                num_left = i;
                break;
            }
        }
        vector<int> left_pre, right_pre;
        vector<int> left_in, right_in;
        for (int i = 0; i < num_left; i++)
        {
            left_in.push_back(vin[i]);
            left_pre.push_back(pre[i+1]);
        }
        for (int i = num_left + 1; i < pre.size(); i++)
        {
            right_in.push_back(vin[i]);
            right_pre.push_back(pre[i]);
        }
        root->left = reConstructBinaryTree(left_pre, left_in);
        root->right = reConstructBinaryTree(right_pre, right_in);
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/N1neDing/article/details/81843330