小试牛刀————构建二叉树(给出二叉树的前序遍历和中序遍历的结果,请重建出该二叉树)

题目描述:

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

题目分析:

1、由题目可知,用前序序列和中序序列来确定出二叉树的结构;

2、前序序列的第一个结点一定为根节点,所以在中序序列中,此根节点的左边都在二叉树的左半边,根节点的右边数据都在二叉树的右半边;(前序遍历:根左右; 中序遍历:左根右; 后序遍历:左右根)

3、依照上述规则,递归根节点左边和右边,则就得到了二叉树的结构,返回根节点。

代码实现:

/*
 * 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* reConstructBinaryTree(vector<int> pre,vector<int> vin) 
    {
        int len = vin.size();	//计算序列长度
        if(len == 0)
        {
            return NULL;
        }
        int p = 0;
        vector<int> L_pre,L_vin,R_pre,R_vin;	//左半边的前序、中序序列对象,右半边的前序、中序序列对象
        TreeNode* root = new TreeNode(pre[0]);	//确定根节点
        for(int i = 0; i < len; i++)
        {
            if(vin[i] == pre[0])	//查找根节点在中序序列中的位置
            {
                p = i;
                break;
            }
        }
        
        for(int i = 0; i < p; i++)
        {
            L_pre.push_back(pre[i+1]);	//根节点左半边前序序列
            L_vin.push_back(vin[i]);	//根节点左半边中序序列
        }
        for(int i = p + 1; i < len; i++)
        {
            R_pre.push_back(pre[i]);	//根节点右半边前序序列
            R_vin.push_back(vin[i]);	//根节点右半边中序序列
        }
        
        root->left = reConstructBinaryTree(L_pre,L_vin);	//左半边递归
        root->right = reConstructBinaryTree(R_pre,R_vin);	//右半边递归
        
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/djh971102/article/details/89107506