关于二叉树与树(森林)的知识点详解

1.二叉树的遍历及优缺点:

前序遍历用来实现目录结构的显示。
中序遍历用来做表达式,在编译底层实现的时候,可以实现加减乘数
后序遍历可以用来实现计算目录内的文件,占用的数据大小。

二叉树最复杂的还是删除,这里特别说明一下,就像书中所说的,为了减少算法的运行时间,在一些情况下,实际上对于删除操作一个好的办法就是做一下标记,并不是真实删除,这种方法叫 做懒惰删除(英文:lazy deletion),其实在实际的数据库操作中我们也经常用这种方法,因为删除确实是消耗资源比较大的操作,在数据库操作中也会使以后的查询变慢。

因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。

2.二叉树的线索化
线索二叉树指:n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域。利用二叉链表中的空指针域,存放指向 结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉链表称为 线索链表,相应的二叉树称为 线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为 前序线索二叉树、中序线索二叉树和后序线索二叉树三种。

优缺点:线索链表解决了无法直接找到该结点在某种遍历序列中的前趋和后继结点的问题。出现了二叉链表找左、右孩子困难的问题。

二叉树的遍历本质上是将一个复杂的非线性结构转换为线性结构,使每个结点都有了唯一前驱和后继(第一个结点无前驱,最后一个结点无后继)。对于二叉树的一 个结点,查找其左右子女是方便的,其前驱后继只有在遍历中得到。为了容易找到前驱和后继,有两种方法。一是在结点结构中增加向前和向后的指针fwd和 bkd,这种方法增加了存储开销,不可取;二是利用二叉树的空链指针。现将二叉树的结点结构重新定义如下:
                           

其中:ltag=0 时lchild指向左子女;
ltag=1 时lchild指向前驱;
rtag=0 时rchild指向右子女;
rtag=1 时rchild指向后继;

(1)中序线索二叉树
中序线索二叉树:若结点的ltag=1,lchild指向其前驱;否则,该结点的前驱是以该结点为根的左子树上按中序遍历的最后一个结点。若rtag=1,rchild指向其后继;否则,该结点的后继是以该结点为根的右子树上按中序遍历的第一个结点。

(2)后序线索二叉树
在后序线索二叉树中查找结点*p的前驱:若结点*p无左子树,则p->lchild指向其前驱;否则,若结点*p有左子树,当其右子树为空时,其左 子树的根(即p->lrchild)为其后序前驱。当其右子树非空时,其右子树的根(即p->rchild)为其后序前驱。

(3)先序线索二叉树
在先序线索二叉树中查找结点的后继较容易,而查找前驱要知道其双亲的信息,要使用栈,所以说先序线索二叉树也是不完善的。


二叉树以后序遍历序列与前序遍历序列反映同样的信息,二叉树 三种序列遍历,都是反映树的结构,他们反映的性质是一样的。


3.最小生成树
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。[1]  最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。
最小生成树是无向图的连通子图,从不同的结点开始,图的存储方式不同,生成树都不相同。

4.二叉排序树
二叉排序树又叫二叉查找树,英文名称是:Binary Sort Tree.  BST的定义就不详细说了,我用一句话概括:左 < 中 < 右。 根据这个原理,我们可以推断:BST的中序遍历必定是严格递增的

5.树的存储结构
三种常用的链表结构
<1>双亲表示法
利用除根以外每个节点只有一个双亲的性质。用一组连续空间存储树的结点(便于寻找某结点的双亲和根结点,但寻找孩子结点需遍历整个结构)
<2>孩子表示法
<3>孩子兄弟表示法
以二叉链表表示为树的存储结构。链表中结点的两个链域分别指向其第一个孩子和下一个兄弟。(该结构便于查询孩子结点,操作容易,但是破坏了树的层次)

6.树(森林)与二叉树的转换
二叉链表即可用于表示二叉树的存储结构,又可以用于表示树的存储结构。因此以二叉链表为介,对于给定的树(森林),可以确定唯一的一颗二叉树与之对应。

树转换二叉树的规则:
<1>树中某结点的第一个孩子成为对应二叉树中该结点的左孩子。
<2>树中某结点的右兄弟结点对应二叉树中该结点的右孩子。
<3>树对应的二叉树根结点的右子树总为空。
树转换为二叉树其右子树一定为空。

                         


二叉树转换为树的规则:
若某结点是父母的左孩子,则把该结点的右孩子,右孩子的右孩子。。。,都与该结点的父结点用连线连接,最后去掉所有父母到右子女的连线。
                     

非连通的图没有生成树。这是有生成树的定义决定的:
生成树是连通图的包含图中的所有顶点的极小连通子图。如果原图不连通,则不可能存在包含原图中所有顶点的连通子图。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值