本文主要讲解如何根据二叉树的中序遍历和后序遍历,构建二叉树。
在写PTA的钻石争霸赛最后一道题时,刚开始需要根据二叉树的中序遍历和后序遍历,构建二叉树,然后才能继续写题。当时经过向学长学习之后,完成了那道题。并且对这个算法有了初步的了解。
今天写了PAT–L2-006 树的遍历这道题,发现这个算法知道原理之后,理解起来很简单。
PAT–L2-006 树的遍历 (25 分)
本文分为两个部分
- 中序遍历与后序遍历的关系
- 利用中序遍历和后序遍历构建树
1.中序遍历与后序遍历的关系
中序遍历: 先遍历左子树,在遍历根节点,最后遍历右子树。
后序遍历: 先遍历左子树,再遍历右子树,最后遍历根节点。
中序遍历序列: 4 2 5 1 6 3 7
后序遍历序列: 4 5 2 6 7 3 1
从中序遍历遍历和后序遍历序列,再结合图我们可以得到它们之间的联系:
- 后序遍历最后一个结点是根节点,中序遍历根节点左边是左子树,右边是右子树
- 后序遍历左子树和中序遍历左子树都是序列前相同的位数,只是子树中的遍历方式不同。.
- 后序遍历右子树是遍历完左子树之后,中序遍历右子树是遍历完根之后,它们之间在序列中的位置差一位,也只是子树的遍历的方式不同。
2. 利用中序遍历和后序遍历构建树
经过上述比较,我们可以得出,中序遍历和后序遍历都是先遍历左子树,之后就是根节点和右子树的遍历顺序不同。中序遍历先遍历根节点在遍历右子树;后序遍历先遍历右子树再遍历根节点,所以后序遍历序列中最后一个元素就是根节点。在中序遍历中找到根节点的位置,就可以得到左右子树的中序遍历序列,然后在结合左右子树的后序遍历,得到其根节点,然后继续根据其子树的子树的中序遍历和后序遍历找到其根节点,一直递归下去直到将树构建完成。
int a[31]; //中序遍历
int b[31]; //后序遍历
//l1为中序遍历序列的最左端;r1为中序遍历序列的最右端
//l2为后序遍历序列的最左端;r2为后序遍历序列的最右端
Node *build(int l1, int r1, int l2, int r2)
{
Node *root = new Node;
root->data = b[r2];//后序遍历最后一个结点为根节点
int i = 0;
while (a[l1 + i] != b[r2])//查找根节点在中序遍历序列中的位置
{
i++;
}
//a[l1+i]为根节点
//构建左子树
if (i > 0)
{
root->lchild = build(l1, l1 + i - 1, l2, l2 + i - 1);
}
else
{
root->lchild = NULL;
}
//构建右子树
if (l1 + i < r1)
{
root->rchild = build(l1 + i + 1, r1, l2 + i, r2 - 1);
}
else
{
root->rchild = NULL;
}
return root;
}
大家好,我是Lucky_追梦仔。一个正在学习编程的小白,希望我的博文,可以帮助到您学习,或者解决您遇到的问题。