重建二叉树

来源:互联网 发布:linux如何查看历史命令 编辑:程序博客网 时间:2024/06/06 08:38
题目描述


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


思路:根节点肯定是前序遍历的第一个数,找到中序遍历根节点所在位置,对于中序遍历,根节点左边的节点位于二叉树的左边,根节点右边的节点位于二叉树的右边,利用上述这点,对二叉树节点进行归并,和shell排序的思想类似,取出前序和中序遍历根节点左边和右边的子树递归,再对其进行上述所有步骤,即再区分子树的左、右子子数,直到叶节点。


C/C++代码:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution{public:    struct TreeNode *reConstructBinaryTree(vector<int> pre, vector<int> in)    {        vector<int> pre_left, pre_right, in_left, in_right;        int in_size = in.size();        if(0 == in_size)        {            return NULL;        }        int val = pre[0];        TreeNode *node = new TreeNode(val);        int p;        for(p = 0; p < in_size; p++)        {            if(in[p] == val)            {                break;            }        }        for(int i = 0; i < in_size; i++)        {            if(i < p)            {                in_left.push_back(in[i]);                pre_left.push_back(pre[i + 1]);            }            else if(i > p)            {                in_right.push_back(in[i]);                pre_right.push_back(pre[i]);            }        }        node -> left = reConstructBinaryTree(pre_left, in_left);        node -> right = reConstructBinaryTree(pre_right, in_right);        return node;    }};


0 0
原创粉丝点击