树学习(6)

来源:互联网 发布:hadoop执行过程源码 编辑:程序博客网 时间:2024/06/05 21:15

1.  m阶B-树的任何一个结点的左右子树的高度都相等。

(因为B-树都是树高平衡的,所以任何一个结点的左右子树的高度都是相等的。)

因为B系列树,包括B-、B+、B*,所有叶子结点都在同一层,所以左右子树的高度都是相等。

 

2.  二叉树的结点的前序序列、中序序列、后序序列中,所有叶子结点的先后顺序(完全相同)

分析:因为根据三个遍历的次序和特点,前序是根左右、中序是左根右、后序是左右根,因此相对次序发生变化的都是子树的根,也就是分支结点(或者说非叶子结点,度数>0)。叶结点的先后顺序是不变的。

 

3.   任何二叉树的后序线索树进行后续遍历时都必须用栈。(错)

分析:因为线索二叉树的节点增加了指向前驱结点和指向后继节点的标志,因此在遍历时无需用栈。线索二叉树的结点增加了双亲结点与兄弟结点的指针,所以在遍历时不需要用栈。

 

一般情况下,二叉树的后序线索树是需要额外用到栈的。虽然每个节点都带有前驱和后续指针,但若前驱和后续指针都被占用,那么只能用栈。注意,考虑只有左半边或者只有右半边的二叉树遍历情况。只有左半边的二叉树,用后序遍历不用栈,只有右半边还是要栈。只有右半边的二叉树前序遍历不要栈,只有左半边的还是要栈。

 

4.  递归式的先序遍历一个n结点,深度为d的二叉树,需要栈空间的大小为:O(d)

分析:二叉树不一定是平衡的,也就是说深度d!=logn;有可能d>>logn,所以栈大小为O(d);

 

在从根向下遍历中,每次先转移到左子树上,而右边则需要暂存起来。因此,最多需要的暂存空间需要d个。

 

分析二:完全二叉树的深度d=logn+1,题目未说明是否为完全二叉树。

 

5.  n个结点的线索二叉树上含有的线索数为n+1;

分析:线索就是利用完之前没有线索化的所有空指针,每个节点有2个指针域(指向左孩子和右孩子),n个结点共有2n个;一个n个结点的树有n-1条边,那么线索树=2n-(n-1)=n+1;

 

什么是线索二叉树

在有n个结点的二叉链表中必定存在n+1个空指针域,因此可以利用这些空指针域存放指向结点的某种遍历次序下的前趋和后继结点的指针,这种指向前趋和后继结点的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树被称为线索二叉树。

为什么要建立线索二叉树

在原来的二叉链表中,查找结点的左,右孩子可以直接实现,可是如果要找该结点的前趋和后继结点呢?这就变得非常困难,所以为了实现这个常见的需求,我们要在每个结点中增加两个指针域来存放遍历时得到的前趋和后继结点,这样就可以通过该指针直接或间接访问其前趋和后继结点。

 

如何将二叉树线索化

 

线索二叉树的常见操作及实现思路

1,二叉树线索化

实现思路:按某种次序遍历二叉树,在遍历过程中用线索取代空指针即可。

2,查找后继节点

实现思路:分两种情况,一,没有右孩子,直接获取。二,有右孩子,中序遍历查找右子树中序遍历的第一个节点即为当前节点的后继节点。

3,查找前驱节点

实现思路:同样也分两种情况,一,没有左孩子,依据线索直接获取。二,有左孩子,中序遍历左子树中往右链中第一个没有右孩子的节点即为前驱节点

4,遍历

实现思路:以中序遍历为例,首先找到中序遍历的开始节点,然后利用线索依次查找后继节点即可。

 

点击打开链接 《数据结构与算法系列15 线索二叉树》

点击打开链接 《线索二叉树


6. 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根节点点的值;

(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点。

 

对任意点,后面的元素要么全部大于它,要么全部小于它。

 

6.  依次把结点的关键字的值50,30,20,150,130,40,80,70,85,15的记录插入到初始化为空的平衡二叉排序树中,在插入过程中平衡树条件如被破坏,则进行必要的调整,得到的平衡二叉排序树的深度为:4

分析:1).首先,深度为3的满二叉树的结点数为7,该二叉树有10个结点,所以它的深度h>3的。

2).其次,该树最后为平衡二叉排序树,其结点数小于深度为4的满二叉树,所以其深度h<=4的。

 

 

原创粉丝点击