二叉树——已知中序和前序,重构二叉树
重建二叉树
http://www.nowcoder.com/questionTerminal/8a19cbe657394eeaac2f6ea9b0f6fcf6
/**
* 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) {
if(vin.size()==0)return NULL;
vector<int> pre_left,pre_right,vin_left,vin_right;
int i = 0;
for (int ii = 0;ii<vin.size();ii++)
{
if(vin[ii]==pre[0])
{
i = ii;
break;
}
}
//i已经找到
for(int j = 0;j<i;j++)
{
vin_left.push_back(vin[j]);
pre_left.push_back(pre[j+1]);//这里是代表第一位是根节点
}
for(int j=i+1;j<vin.size();j++)
{
vin_right.push_back(vin[j]);
pre_right.push_back(pre[j]);
}
TreeNode* result = new TreeNode(pre[0]);
result->left = reConstructBinaryTree(pre_left,vin_left);
result->right = reConstructBinaryTree(pre_right,vin_right);
return result;
}
};
前序:根左右
中序:左根右
后序:左右根
思路:
①首先找到前序的第一个,也就是整个二叉树的根
②再找到中序序列中的这个点,以此分界,左为左子树的中序序列,右为右子树的中序序列
③在前序中,刨除第一个根节点,剩下也按此分开,左为左子树的前序序列
④递归
结果:
已知后序和中序也可以
已知前序和后序不唯一:当一个根只有一颗子树时,通过前序遍历和后序遍历,无法确定该子树是这个根的左子树还是右子树
查看10道真题和解析
