二叉树的应用
目录
一、二叉树遍历算法的应用
二、树的存储结构
1、双亲表示法
2、孩子表示法
带双亲的孩子链表
3、孩子兄弟表示法(左孩子、右兄弟)较为普遍
三、森林与二叉树的转换
四、哈夫曼树
哈夫曼(Huffman)树的构造
一、二叉树遍历算法的应用
二叉树遍历算法的应用
计算二叉树深度(或高度)
如果是空树,则深度为0; 否则,递归计算左子树的深度记为m,递归计算右子树的深度记为n,二叉树的深度则为m与n的较大者加1。
def deep(self,node):
# 如果空树,表示树的深度为0
if node == None:
return 0
# 否则,遍历树的左子树和右子树
else:
leftdeep = self.deep(node.left)
rightdeep = self.deep(node.right)
# 获得左右子树中深度最大的树的深度
maxdeep = max(leftdeep,rightdeep)
# 加上根节点的层次,因此为maxdeep+1
return maxdeep+1
计算二叉树节点总数
如果是空树,则节点个数为0; 否则,节点个数为左子树的节点个数+右子树的节点个数再+1。
def countNode(self,node):
if node == None:
return 0
else:
leftCount = self.countNode(node.left)
rightCount = self.countNode(node.right)
sumCount = leftCount+rightCount+1
return sumCount
二、树的存储结构
1、双亲表示法
2、孩子表示法
由于树中结点有多棵子树,故可采用多重链表,每个结点有多个指针域,每个指针指向一棵子树的根结点。
将每个结点的孩子结点排列起来,视为一个线性表,且以单链表作为存储结构,n个结点具有n个孩子链表,n个头指针又组成一个线性表,采用顺序存储结构存储。
带双亲的孩子链表
3、孩子兄弟表示法(左孩子、右兄弟)较为普遍
二叉链表表示法:结点的两个链域分别指向该结点的第一个孩子、下一个兄弟。
三、森林与二叉树的转换
将F={T1, T2,⋯,Tn} 中的每棵树转换成二叉树。
将森林中的第二棵树的根结点看成第一棵树根节点的兄弟,依此类推,第三棵树的根结点看成第二棵树根节点的兄弟
四、哈夫曼树
哈夫曼树又称最优二叉树,是一类带权路径长度最短的树
哈夫曼(Huffman)树的构造
路径:由一节点到另一节点间的分支所构成
路径的长度:路径上的分支数目
带权路径长度:节点到根的路径长度与节点上权值的乘积
树的带权路径长度WPL:树中所有叶子节点的带权路径长度之和
哈夫曼树:带权路径长度最小的树
权值越大的节点越靠近根节点-----WPL越小