08.树:2_二叉树
为什么80%的码农都做不了架构师?>>>
二叉树(Binary Tree)是n(n>=0)个结点的有限集合。
二叉树是每个节点最多有两个子树的树结构。
通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。(所以二叉树不存在度大于2的结点。)
二叉树常被用于实现二叉查找树和二叉堆。
1.二叉树的介绍
二叉树的5种基本形态

二叉树的五种形态

斜树:
斜树是一定要斜的,但是斜也要斜得有规范。
例如:

满二叉树:
完美的那是理想,不完美的才是人生。
1.所有的分子结点:都存在左子树
和右子树
。
2.所有的叶子都在同一层上。

完全二叉树
1.所有的分子结点:都存在左子树
和右子树
。
2.深度可以不一样。
3.最下层的叶子一定都集中在左部连续的位置。
深度为: [log2n]+1


2.二叉树的存储结构:
1.顺序存储(适用性不强)

2.链式存储(国际惯例)

3.二叉树的遍历
二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。
二叉树的4种遍历方式:
1.前序遍历:(左子树在前)
1.先根结点
2.前序遍历左子树
3.前序遍历右子树

2.中序遍历(父结点在中间)
1.先访问根结点
2.中序遍历父结点的左子树
3.再访问根结点
4.中序遍历父结点的右子树

3.后序遍历(先遍历子叶后父结点)
1.从左到右,先访问叶子 再访问结点。
2.遍历,直到最后访问到根结点。

4.层序遍历

4.线索二叉树

浪费:4*10=40个字节。(32bit的机器:1个指针,4个字节。)


参考地址:http://blog.csdn.net/littlethunder/article/details/9707669

#!/usr/bin/python
# coding: utf-8class Node:def __init__(self,value=None,left=None,right=None):self.value=valueself.left=leftself.right=rightdef preTraverse(root):if root==None:returnprint root.value,preTraverse(root.left)preTraverse(root.right)def midTraverse(root):if root==None:returnmidTraverse(root.left)print root.value, midTraverse(root.right)def afterTraverse(root):if root==None:returnafterTraverse(root.left)afterTraverse(root.right)print root.value, if __name__=='__main__':root=Node('D', Node('B',Node('A'),Node('C')), Node('E', right=Node('G', Node('F'))))print('前序遍历:')preTraverse(root)print('\n')print('中序遍历:')midTraverse(root)print('\n')print('后序遍历:')afterTraverse(root)print('\n')
结果:
前序遍历:
D B A C E G F 中序遍历:
A B C D E F G 后序遍历:
A C B F G E D [Finished in 0.0s]
已知前序遍历和中序遍历,求后序遍历
#!/usr/bin/python
# coding: utf-8# 前序遍历
preList=list('DBACEGF')
# 中序遍历
midList=list('ABCDEFG')
# 后序遍历
afterList=[]"""
递归分析
1.已知前序遍历,相当于知道了结点。
2.已知中序遍历,相当于知道了左右树的内容。
3.通过递归,将结点带入到中序遍历中,那么结点左边的就是左子树,后边就是右子树"""def findTree(preList, midList, afterList):# 可能没有右结点if len(preList) == 0:return # 只剩下左结点if len(preList) == 1:afterList.append(preList[0])return # 结点的值root = preList[0]# 结点的索引位置n = midList.index(root)# 后序索引:左,右,结点 的顺序# 左findTree(preList[1:n+1], midList[:n], afterList)# 右findTree(preList[n+1:], midList[n+1:], afterList)# 结点afterList.append(root)findTree(preList, midList, afterList)
print afterList
结果:
['A', 'C', 'B', 'F', 'G', 'E', 'D']
[Finished in 0.0s]
5.树、森林及二叉树的相互转换
树的遍历方式:
1.先根遍历(先访问树的根结点,然后再依次先根遍历根的每棵子树。)
2.后根遍历(先依次遍历每棵子树,然后再访问根结点。)
森林的遍历方式:
1.前序遍历(1.树的先根遍历 依次访问森领的每一棵树)
2.后序遍历(2.树的后根遍历 依次访问森领的每一棵树)


6.赫夫曼树(数据压缩)
1.赫夫曼树 定义与原理


WPL的值越小,说明构造出来的二叉树性能越优。

6.赫夫曼编码
压缩数据能节省的 20%~90%的空间,具体压缩率依赖于数据的特性。
名词解释: 定长编码,变长编码,前缀码。
-定长编码: 向ASCII编码
-变长编码: 单个编码的长度不一致,可以根据整体出现频率来调节
-前缀码:所谓的前缀码,就是没有任何码字是其他的码字的前缀

代码的实现步骤:
1.build a priority queue
2.build a huffmanTree
3.build a huffmanTable
4.encode
5.decode
huffman代码实现
# coding: utf8
import random
#定义节点
class Node:def __init__(self,weight=0,left=None,right=None):self.weight=weightself.left=leftself.right=right
#按权值排序
def sort(list):return sorted(list,key=lambda node:node.weight)
#构建哈夫曼树
def Huffman(list):while len(list)!=1:a,b=list[0],list[1]new=Node()new.weight=a.weight+b.weightnew.left,new.right=a,blist.remove(a)list.remove(b)list.append(new)list=sort(list)return list
#中序遍历
def traval(First):if First==None : returntraval(First.left)print First.weighttraval(First.right)
#获得树的长度
def get_height(node):if node.left==None and node.right==None: return 1return get_height(node.left)+get_height(node.right)list=[]
for i in range(1,11):list.append(Node(i))
list=sort(list)head=Huffman(list)[0]
print(get_height(head))
转载于:https://my.oschina.net/repine/blog/693964
08.树:2_二叉树相关推荐
- 王道计算机考研 数据结构 (树与二叉树)
第五章.树与二叉树 5.1.1_树的定义和基本术语 树的基本概念 结点.树的属性描述 有序树vs无序树 树vs森林 思维导图 5.1.2_树的性质 考点1 考点2 考点3 考点4 考点5 考点6 思维 ...
- 【Python数据结构系列】☀️《树与二叉树-基础知识》——知识点讲解+代码实现☀️
文章目录 数据结构之树和二叉树 第一部分 树和二叉树的基础知识 1.树和二叉树的定义 1.1 树的定义 1.2 树的基本术语 1.3 二叉树的定义 2.二叉树的性质和存储结构 2.1 二叉树的性质 2 ...
- 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查
03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...
- 数据结构--树和二叉树
文章目录 树和二叉树 树 1.树的定义 2.树的逻辑表示 3.树的基本术语: 4.树的性质 5.树的基本运算 二叉树 二叉树的存储结构 二叉树的遍历 树和二叉树 树 1.树的定义 2.树的逻辑表示 树 ...
- 6-5-树的双亲表示法-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...
课本源码部分 第6章 树和二叉树 - 树的双亲表示法 --<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版) ...
- 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)
目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...
- 带父节点的平衡二叉树_学习数据结构--第四章:树与二叉树(平衡二叉树)
第四章:树与二叉树(平衡二叉树) 1.平衡二叉树 平衡二叉树:AVL,任意结点的平衡因子的绝对值不超过一. 平衡因子:左子树高度 - 右子树高度 如上图二叉树,是否是平衡二叉树? 可以把所有结点的平衡 ...
- 数据结构-王道-树和二叉树
[top] 树和二叉树 树:是\(N(N\geq0)\)个结点的有限集合,\(N=0\)时,称为空树,这是一种特殊情况.在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点. 当\(N>1 ...
- 数据结构C#版笔记--树与二叉树
图1 上图描述的数据结构就是"树",其中最上面那个圈圈A称之为根节点(root),其它圈圈称为节点(node),当然root可以认为是node的特例. 树跟之前学习过的线性结构不同 ...
最新文章
- 使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)
- php笔记之表单验证
- 准备写一个Ibatisnet开发指南
- 12 快件文档“更新终止”从作者“xxx”收到
- Adding Keyword And Description meta tags to each page by inheritence
- 计算机快捷键屏幕录制,屏幕录制软件哪个好用?设置电脑录屏快捷键
- Internal Error 2738 - Installing ArcGIS Server 9.3,10 for Java
- 读书笔记 —— 《深入浅出MySQL数据库开发、优化与管理维护 第2版》
- 各个音阶的频率_声音各个频率的还原
- 【vulhub漏洞复现】ActiveMQ 反序列化漏洞 (CVE-2015-5254)-01
- WPS文字在线转换成Word
- 2023秋招大厂经典面试题及答案整理归纳(201-220)校招必看
- Kaggle泰坦尼克号生存预测挑战——模型建立、模型调参、融合
- nRF51822 TWI学习
- 安笙机器人_首席继承者:国民校草玩心动在线阅读_155.性子高冷_首席继承者:国民校草玩心动全本TXT下载_无限小说网...
- SecurityManager——Java 语言的保护伞
- 在MAC上搭建cordova3.4.0的IOS和android开发环境
- 做淘客太难?一个淘客三年来的经历与心得
- 1000亿元!传华为将打包出售荣耀品牌
- 易语言“非主流”,杀毒软件“躲猫猫”
热门文章
- 服务框架HSF分析之一容器启动
- Monitorix 2.6.0 发布,系统监控工具
- OPENSSH升级为7.4
- EasyUI TextBox的onkeypress事件
- jquery IE中同一个url第二次AJAX调用无法触发
- CentOs中mysql的安装与配置
- vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb
- USACO 1.5 Prime Palindromes
- 计算机网络机械特性是指,《计算机网络与通信》第1——3章 习题及思考题
- python三角网格代码_python中shapely的多多边形三角网格/网格