先序,中序恢复二叉树
部分递归过程:
代码示例:
//n是当前所操作字符串的大小
void Tree::CreatePreIn(Node*& root, const char* vlr, const char* lvr, int n)
{
//当左右结点个数为0时,到叶子节点
if (n == 0)
root = NULL;
else
{
/*
* 先序遍历的第一个vlr[0]即是根,在中序遍历中查找根的位置,
* 将中序遍历分为左右两部分
*/
int k = 0;
while (vlr[0] != lvr[k])
k++;/*
k所在的位置即是根,k的左边是当前根的左子树,
右边是当前根的右子树
*/
root = new Node(vlr[0]);
CreatePreIn(root->m_left, vlr + 1, lvr, k);
CreatePreIn(root->m_right, vlr + 1 + k, lvr + k + 1, n - k - 1);
}
}
后序,中序恢复二叉树
部分递归过程:
代码示例:
void Tree::CreatePostIn(Node*& root, const char* lvr, const char* lrv, int n)
{
if (n == 0)
root = NULL;
else
{
int k = 0;
//由于后序是左右根,所以根在最后面
while (lrv[n - 1] != lvr[k])
k++;//先在中序中找到根结点
root = new Node(lvr[k]);
CreatePostIn(root->m_left, lvr, lrv, k);
CreatePostIn(root->m_right, lvr + k + 1, lrv + k, n - k - 1);
}
}