数据结构笔记-二叉树及其实现 python

概述

二叉树是一种最简单的树形结构,其特点是树中每个结点至多关联到两个后继结点,也就是,一个节点可以关联到的结点可以为0,1,2,这也是二叉树一个节点度的定义,另一个特点是结点关联的后继结点明确的分左右,一般有一个根结点,然后根结点的左右后继结点分别称为根结点的左,右孩子,或者左,右关联结点。

 

1.二叉树

定义:

二叉树是结点的有穷集合。这个集合或者是空集,或者其中有一个称为根结点的特殊结点,其余结点分属两颗不相交的二叉树,这两颗二叉树分别是原二叉树的左,右子树。(显然,二叉树的定义是一种递归定义,所以接下来的二叉树也用递归实现)

2.完全二叉树

定义:

对于一颗高度为h的二叉树,如果0至h-1层的节点都满(第i层有2^i个结点),如果下一层结点不满,则所有结点在最左边连续排列,空位都在右边,这样的树称为完全二叉树。

 

3.性质

1):在非空二叉树的第i层至少有 2^i 个1结点(i≥0) 

第0层有2^0=1个结点,第1层有2^1=2个结点,假设第n层有2^n个结点,每个结点最多有两个子节点,所以n+1层至多有2^n * 2 = 2^(n+1)个结点,运用归纳法证毕。

2):高度为h的二叉树至多有2^(h+1)-1个结点(h大于等于0)

第0层最多2^0=1个,第二层最多2^1=2,以此类推,高度h的二叉树共2^0+2^1+……+2h,等比数列求和,带公式即可得出结论。

3):对于一颗满二叉树,度为0的结点(叶节点)总比度为2的结点多一个

用n0,n1,n2分别表示度为0,1,2的结点数,n表示整个整个二叉树的结点数,则n = n0+n1+n2,又根据结点的性质(所有节点的读书之和+1=结点总数),可得n = n1 + 2*n2 +1 ,两个式子做减法,就能得到最后结论,n0=n2+1。

4):一颗完全二叉树的高度h=|log2(n)|,即不大于log2(n)的最大整数

假设完全二叉树有n个结点1,高度为h,根据性质2),2^h-1

5):n各结点的完全二叉树的结点按层次并按从左到右的顺序从0开始编号,对任一结点 i(0≤i≤n-1):

△ 序号为0的结点是根

△ 对于i>0,其父节点编号(i-1)/ 2

△ 若2 x i + 1 < n ,其左子节点序号为 2 x i + 1,否则无左子节点

△ 若2 x i + 2 < n ,其右子节点序号为 2 x i + 2,否则无右子节点

 

4.把有序数组转换为二叉树

将数组1,2,3,4,5,6,7,8,9,10转换为二叉树

思路:

将数组中心元素作为二叉树根结点,把数组分为两部分,对于数组的两部分采用相同的构造方法,递归的实现二叉树。

       数据结构笔记-二叉树及其实现 python_第1张图片

         数据结构笔记-二叉树及其实现 python_第2张图片

实现

#构建二叉树类
class BitNode:
	def __init__(self):
		self.data = None
		self.lchild = None
		self.rchild = None

#把有序数组转换为二叉树
def array2tree(arr,start,end):
	root = None
	if end >= start:
		root = BitNode();
		mid = int((start+end+1)/2) #取整
		#树的根节点为数组中间的元素
		root.data = arr[mid]
		#递归用左半部分构造root的左子树
		root.lchild = array2tree(arr,start,mid-1)
		#递归用左半部分构造root的右子树
		root.rchild = array2tree(arr,mid+1,end)
	else:
		root = None
	return root

 

5.从顶层逐行遍历二叉树

思路:

通过引入队列,在遍历每个结点的过程中记录结点的左右子结点信息,遍历直到树为空,先遍历根结点,然后将左右子结点加入队列,继续遍历队列中下一个元素,如果有结点,按左右结点顺序加入队列,遍历直到队列为空,没有新的元素增加。

from collections import deque
#用层序方法遍历二叉树
def printTreeLayer(root):
	if root == None:
		return
	queue = deque()
	#根节点进入队列
	queue.append(root)
	while len(queue) > 0:
		#访问当前节点
		p = queue.popleft()
		print(p.data,end = ' ')
		#如果左孩子不为空则加入队列
		if p.lchild != None:
			queue.append(p.lchild)
		#如果右孩子不为空则加入队列
		if p.rchild != None:
			queue.append(p.rchild)
	print()

结果:

if __name__ == "__main__":
	arr = [1,2,3,4,5,6,7,8,9,10]
	root = array2tree(arr,0,len(arr)-1)
	print('层序遍历结果为:')
	printTreeLayer(root)
层序遍历结果为:
6 3 9 2 5 8 10 1 4 7 

 

你可能感兴趣的:(数据结构)