关于二叉树的经典题型,有很多,比如构造哈夫曼,求权值,树和森林的转化,二叉树的遍历,最小生成树等等。今天想跟大家分享一下二叉树遍历方面的问题和最小生成树。
首先说一下二叉树的遍历吧,有大家耳熟能详的三种遍历,即前序遍历,中序遍历,后序遍历等等,这里的序主要指的是根节点被访问的顺序。
先序遍历,即先访问根节点,在访问左子树,最后访问右子树。
代码实现如下
Type preorder(type *T)
{
visit(T);
preorder(T->lchild);
preorder(T->rchild);
}
先序遍历,即先访问根节点,在访问左子树,最后访问右子树。
代码实现如下
void preorder(type *T)
{
visit(T);
preorder(T->lchild);
preorder(T->rchild);
}
中序遍历,即先访问左子树,在访问根节点,最后访问右子树。
代码实现如下
void preorder(type *T)
{
preorder(T->lchild);
visit(T);
preorder(T->rchild);
}
后序遍历也差不多,值得注意的是,在题目要求你写先序中序后序遍历的时候,可以先将对应的代码写出来,然后跟着代码一步步实现。
一般比较常考的题就是给你三个序列中间的两个,然后让你求下一个,这种题该怎么做呢,话不多说,来看题。
已知一棵二叉树的前序遍历序列和中序遍历序列分别为ABCDEFGHI 和BCAEDGHFI,如何求该二叉树的后序遍历呢。
首先我们得先构造出这棵树,如何构造呢,我们得一步步来,首先可以判断A是根节点,BC在A的左子树上,而其他的在A的右子树上,然后我们来确定BC的位置,B肯定为A的左子树,而C因为在B的后面,所以只能是B的右子树。这时候问题就简化为求EDGHFI这棵树的顺序了,我们继续如法炮制,如图:
慢慢分解,从上至下,逐步确认。此时我们可以清楚的得出该二叉树的后序遍历cbehgifda.
还有一类题目就是关于最小生成树的问题了,这类问题一般有两种解决方法,一种修改边,一种从点出发,进行连接。分别为普利姆和克鲁斯卡尔算法;
普利姆算法的核心是:从一个定点构建最小生成树,每次将代价最小的定点纳入最小生成树,直到所有的节点都被纳入这棵树里。但普利姆算法不能用来算带有负权值的边。
克鲁斯卡尔算法的核心是:每次选择一条权值最小的边,(原本已经联通的就不考虑,直到所有的节点都被纳入这颗树中)比如: