标签:
几乎所有的人都知道二叉树可以根据前序遍历+中序遍历或者后序遍历+中序遍历的方式重新建立原来的二叉树,并且结果是唯一的。下面就来看一下相关的方法。
给定一棵二叉树的前序和中序遍历序列,重新建立这棵二叉树。
注意:在前序中确定了根节点以后,要去中序里面查找这个根节点,这时的查找没必要从数组的0下面开始,从这个树的中序的第一个点开始。然后查找的个数为停止的下表减去中序开始的下表。
这里重建二叉树用的是递归的方法,要注意递归的出口。不然会死循环。
所以代码实现:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
int preStart = 0;
int preLast = preorder.size() - 1;
int inStart = 0;
int inLast = inorder.size() - 1;
return SubTreeBuild(preorder, preStart, preLast, inorder, inStart, inLast);
}
TreeNode* SubTreeBuild(vector<int>& preorder, int preStart, int preLast, vector<int>& inorder, int inStart, int inLast)
{
if(preStart > preLast || inStart > inLast)
return NULL;
TreeNode *root = new TreeNode(preorder[preStart]);
//search the root in the inorder
int i = inStart;
while(inorder[i] != preorder[preStart])
{
++i;
}
root->left = SubTreeBuild(preorder, preStart + 1, preStart + i - inStart, inorder, inStart, i - 1);
root->right = SubTreeBuild(preorder, preStart + 1 + i - inStart, preLast, inorder, i + 1, inLast);
return root;
}//SubTreeBuild
其实递归的方式并不是难点,重要的是定边界值。
TreeNode* SubTreeBuild(vector<int>& inorder, int ileft, int iright, vector<int>& postorder, int pleft, int pright)
{
if(ileft > iright || pleft > pright)
return NULL;
TreeNode *root = new TreeNode(postorder[pright]);
//search the root node in the inorder
int i = ileft;
while(inorder[i] != postorder[pright])
{
++i;
}
root->left = SubTreeBuild(inorder, ileft, i - 1, postorder, pleft, pleft + i - ileft - 1);
root->right = SubTreeBuild(inorder, i + 1, iright, postorder, pleft + i - ileft, pright - 1);
return root;
}
标签:
原文地址:http://www.cnblogs.com/stemon/p/4769181.html