重建二叉树

来源:互联网 发布:matlab最优算法 编辑:程序博客网 时间:2024/06/06 20:52

题目描述

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

前序遍历序列的第一个元素是根结点,那么在中序遍历序列中找到该节点,该节点前的序列为左子树,节点后的序列为右子树。例如上面的例子,从前序遍历序列知道1时根结点,在中序遍历序列中找到1,1前面的4 7 2为左子树的中序遍历序列,1后面的5 3 8 6为右子树的中序遍历序列。左子树有3个元素,右子树有4个元素。然后看前序遍历序列,1后面的3个元素2 4 7为左子树的前序遍历序列,接下来的4个元素3 5 6 8为右子树的前序遍历序列。所以这道题可以用递归实现:

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:struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) {if (!pre.size() || !in.size()) return NULL;if (pre.size() != in.size()) return NULL;TreeNode* root = new TreeNode(pre[0]);int i;for (i = 0; i < in.size(); i++)if (in[i] == pre[0])  break;vector<int> preLeft, preRight, inLeft, inRight;for (int j = 1; j <= i; j++)preLeft.push_back(pre[j]);for (int j = i + 1; j < pre.size(); j++)preRight.push_back(pre[j]);for (int j = 0; j < i; j++)inLeft.push_back(in[j]);for (int j = i + 1; j < in.size(); j++)inRight.push_back(in[j]);root->left = reConstructBinaryTree(preLeft, inLeft);root->right = reConstructBinaryTree(preRight, inRight);        return root;}};



0 0
原创粉丝点击