题目地址:http://www.nowcoder.com/ta/coding-interviews?page=
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
#include<iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* PreInCreat(vector<int> pre,vector<int> in,int l1,int h1,int l2,int h2)
{
int i;
TreeNode* root = new TreeNode(pre[l1]);
for(i=l2;in[i]!=root->val;i++);
int llen = i-l2;
int rlen = h2-i;
if(llen)
root ->left = PreInCreat(pre,in,l1+1,l1+llen,l2,l2+llen-1);
else
root ->left = NULL;
if(rlen)
root ->right = PreInCreat(pre,in,h1-rlen+1,h1,h2-rlen+1,h2);
else
root ->right = NULL;
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
{
//cout << pre.size();
return PreInCreat(pre,in,0,pre.size()-1,0,in.size()-1);
}
void PostOrderTravel(TreeNode* L)
{
if(L->left)
PostOrderTravel(L->left);
if(L->right)
PostOrderTravel(L->right);
cout << L->val << " ";
}
int main()
{
vector<int> pre{1,2,3,4,5,6};
vector<int> in{3,2,1,5,4,6};
//令i依次为ivec中的每一个元素,并显示
for(auto i : pre)
cout << i << " ";
cout << endl;
for(auto i : in)
cout << i << " ";
cout << endl;
//reConstructBinaryTree(pre, in);
TreeNode* root = reConstructBinaryTree(pre, in);
PostOrderTravel(root);
}
上面为实验的代码
提交的代码如下
/**
* 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* PreInCreat(vector<int> pre,vector<int> in,int l1,int h1,int l2,int h2)
{
int i;
TreeNode* root = new TreeNode(pre[l1]);
for(i=l2;in[i]!=root->val;i++);
int llen = i-l2;
int rlen = h2-i;
if(llen)
root ->left = PreInCreat(pre,in,l1+1,l1+llen,l2,l2+llen-1);
else
root ->left = NULL;
if(rlen)
root ->right = PreInCreat(pre,in,h1-rlen+1,h1,h2-rlen+1,h2);
else
root ->right = NULL;
return root;
}
struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
return PreInCreat(pre,in,0,pre.size()-1,0,in.size()-1);
}
};
其他人的麻袋
/**
* 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) {
int length = in.size();
if (length == 0)
{
return NULL;
}
vector<int> left_pre, right_pre, left_in, right_in;
TreeNode *head = new TreeNode(pre[0]); //创建根节点
int root = 0; //根节点在中序遍历中的位置
for (int i = 0; i < length; i++)
{
if (in[i] == pre[0])
{
root = i;
break;
}
}
//对于中序遍历,根节点左边的节点属于左子树,根节点右边的节点属于右子树
for (int i = 0; i < root; i++)
{
left_in.push_back(in[i]);
left_pre.push_back(pre[i + 1]);
}
for (int i = root + 1; i < length; i++)
{
right_in.push_back(in[i]);
right_pre.push_back(pre[i]);
}
head->left = reConstructBinaryTree(left_pre, left_in);
head->right = reConstructBinaryTree(right_pre, right_in);
return head;
}
};
继续改改,用左开右闭,[begin,end) 来表示集合
TreeNode* PreInCreat(vector<int> pre,vector<int> in,int l1,int h1,int l2,int h2)
{
int root_in_in;
TreeNode* root = new TreeNode(pre[l1]);
for(root_in_in = l2;in[root_in_in]!=root->val;root_in_in++);
int llen = root_in_in-l2;
int rlen = h2 - (root_in_in+1);
if(llen)
root->left = PreInCreat(pre,in,l1+1,l1+llen+1,l2,root_in_in);
else
root->left = NULL;
if(rlen)
//root->right = PreInCreat(pre,in,l1+llen+1,h1,root_in_in+1,h2);
root->right = PreInCreat(pre,in,h1-rlen,h1,root_in_in+1,h2);
else
root->right = NULL;
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
{
//cout << pre.size();
return PreInCreat(pre,in,0,pre.size(),0,in.size());
}
可以运行