《数据结构和Java集合框架第三版》读书笔记(七)二叉树

一,概念

自由树:连通的无回路的无向图
有根树:在自由树中选定一顶点做根。
考虑根为r的有根树中的一个结点x
祖先:从r到x的唯一路径上的结点y称为x的一个祖先,x称为y的一个子孙。如果xy,则成为真祖先、真子孙。
双亲:从r到x的路径中最后一条边是(y,x),则y是x的双亲,x是y的子女
兄弟:具有同样双亲的两个结点互为兄弟结点
叶结点:没有子女的结点
结点的度:有根树T中结点x的子女数目
结点在树中的深度:从根r到结点x的路径的长度称为x在T中的深度(depth)。又称为元素所在层(level)。根结点深度为0
树的高度:树中结点的最大深度。也就是根与最远叶结点之间路径的长度

有序树:子女结点有序的有根树。第一子女、第二子女、第三子女。。。
二叉树:二叉树是n(n≥0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为根的左子树和右子树的、互不相交的二叉树组成。
二叉树的结点最多有两棵子树,且子树有左右之分,不可颠倒。这是二叉树和有序树的不同之处。
严格二叉树:所有结点的度都不为 1的非空二叉树。即结点或者是叶结点,或者度为2。英文翻译为 strictly binary tree or full binary tree or two-tree
满二叉树:所有叶子结点在同一层上,除叶子结点外的所有结点均有两个子结点。节点数达到最大值。英文翻译为perfect binary tree


                                        满二叉树

一棵满二叉树t,高度为h,从第0层到第h层。第k层的结点数目为,总结点数目为

完全二叉树:除了最低层外,每一层都是满的,最低层上的叶结点尽可能地靠近左边。英文翻译为complete binary tree


完全二叉树共n个结点,每一个结点都和同样深度的满二叉树的前n个编号的结点一一对应。若位置i处的结点有子结点,则其左子结点位置为2i+1,右子结点位置为2i+2。一棵完全二叉树的所有元素可以存储在一个数组里,位置i处的元素可以放在数组索引i处


二,二叉树的性质:

对于任意非空二叉树t ,总结点数记作n(t)或n,高度为h,从第0层到第h层。

1,若有n0个叶子结点,有n2个度为2的结点,则:n0=n2+1

证明:设:有n0个叶子结点,有n1个度为1的结点,有n2个度为2的结点,
        则二叉树中结点总数为:n=n0+n1+n2 
设所有进入分支的总数为m,则总的结点个数为:n=m+1
总的射出分支与总的进入分支数相等:m=n1+2n2 
因此: n0+n1+n2=n1+2n2+1    所以: n0= n2+1 

2,n0≤(n+1)/2.0  当且仅当这是一个严格二叉树(two-tree)时等号成立

证明:n=n0+n1+n2 =2n0-1+n1≥2n0-1

所以n0≤(n+1)/2

因为是java语法,所以应当写作浮点数的除法n0≤(n+1)/2.0,而不是整数的除法

3,  当且仅当这是一个满二叉树时等号成立

满二叉树的高度是n的对数


如果二叉树的每个非叶结点有且仅有一个子结点,这棵二叉树可称为一条链( chain)。链的高度h=n(t)-1,高度同n成线性关系。

在一棵高度为n的对数的二叉树中插入、删除一个元素,最差时间worstTime(n)仅仅是O(logn)

而在链表LinkedList或ArrayList中插入、删除一个元素,最差时间worstTime(n)是O(n)

三,对二叉树的遍历


1,中序遍历(左-根-右)
inOrder(t){
	if(t非空){
		inOrder(t的左子树);
		访问t的根元素;
		inOrder(t的右子树);
	}
}


遍历顺序:47-31-42-50-25
2,后序遍历(左-右-根)
postOrder(t){
	if(t非空){
		postOrder(t的左子树);
		postOrder(t的右子树);
		访问t的根元素;
	}
}


遍历顺序:47-42-25-50-31


可用来产生后缀表达式

3,前序遍历(根-左-右)


preOrder(t){
	if(t非空){
		访问t的根元素;
		preOrder(t的左子树);	
		preOrder(t的右子树);	
	}
}



采用前序遍历的二叉树搜索方法称为深度优先搜索

4,逐层遍历(宽度优先遍历)

breadthFirst(tree){
//queue为二叉树(引用)的队列
//tree为二叉树(引用)
	if(tree空) return;
	queue.enqueue(tree);
	while(queue.size()>0){
	        Entry entry=queue.dequeue();
	        if(entry的左子树非空)
			queue.enqueue(entry的左子树);
		if(tree的右子树非空)
			queue.enqueue(entry的右子树);	
	}
}


 

如果是完全二叉树,可以将元素按照逐层从左到右的顺序完全存储到数组中,宽度优先遍历就成为了一个数组迭代器。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值