为什么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_二叉树相关推荐

  1. 王道计算机考研 数据结构 (树与二叉树)

    第五章.树与二叉树 5.1.1_树的定义和基本术语 树的基本概念 结点.树的属性描述 有序树vs无序树 树vs森林 思维导图 5.1.2_树的性质 考点1 考点2 考点3 考点4 考点5 考点6 思维 ...

  2. 【Python数据结构系列】☀️《树与二叉树-基础知识》——知识点讲解+代码实现☀️

    文章目录 数据结构之树和二叉树 第一部分 树和二叉树的基础知识 1.树和二叉树的定义 1.1 树的定义 1.2 树的基本术语 1.3 二叉树的定义 2.二叉树的性质和存储结构 2.1 二叉树的性质 2 ...

  3. 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查

    03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...

  4. 数据结构--树和二叉树

    文章目录 树和二叉树 树 1.树的定义 2.树的逻辑表示 3.树的基本术语: 4.树的性质 5.树的基本运算 二叉树 二叉树的存储结构 二叉树的遍历 树和二叉树 树 1.树的定义 2.树的逻辑表示 树 ...

  5. 6-5-树的双亲表示法-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第6章  树和二叉树 - 树的双亲表示法 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版) ...

  6. 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)

    目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...

  7. 带父节点的平衡二叉树_学习数据结构--第四章:树与二叉树(平衡二叉树)

    第四章:树与二叉树(平衡二叉树) 1.平衡二叉树 平衡二叉树:AVL,任意结点的平衡因子的绝对值不超过一. 平衡因子:左子树高度 - 右子树高度 如上图二叉树,是否是平衡二叉树? 可以把所有结点的平衡 ...

  8. 数据结构-王道-树和二叉树

    [top] 树和二叉树 树:是\(N(N\geq0)\)个结点的有限集合,\(N=0\)时,称为空树,这是一种特殊情况.在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点. 当\(N>1 ...

  9. 数据结构C#版笔记--树与二叉树

    图1 上图描述的数据结构就是"树",其中最上面那个圈圈A称之为根节点(root),其它圈圈称为节点(node),当然root可以认为是node的特例. 树跟之前学习过的线性结构不同 ...

最新文章

  1. 使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)
  2. php笔记之表单验证
  3. 准备写一个Ibatisnet开发指南
  4. 12 快件文档“更新终止”从作者“xxx”收到
  5. Adding Keyword And Description meta tags to each page by inheritence
  6. 计算机快捷键屏幕录制,屏幕录制软件哪个好用?设置电脑录屏快捷键
  7. Internal Error 2738 - Installing ArcGIS Server 9.3,10 for Java
  8. 读书笔记 —— 《深入浅出MySQL数据库开发、优化与管理维护 第2版》
  9. 各个音阶的频率_声音各个频率的还原
  10. 【vulhub漏洞复现】ActiveMQ 反序列化漏洞 (CVE-2015-5254)-01
  11. WPS文字在线转换成Word
  12. 2023秋招大厂经典面试题及答案整理归纳(201-220)校招必看
  13. Kaggle泰坦尼克号生存预测挑战——模型建立、模型调参、融合
  14. nRF51822 TWI学习
  15. 安笙机器人_首席继承者:国民校草玩心动在线阅读_155.性子高冷_首席继承者:国民校草玩心动全本TXT下载_无限小说网...
  16. SecurityManager——Java 语言的保护伞
  17. 在MAC上搭建cordova3.4.0的IOS和android开发环境
  18. 做淘客太难?一个淘客三年来的经历与心得
  19. 1000亿元!传华为将打包出售荣耀品牌
  20. 易语言“非主流”,杀毒软件“躲猫猫”

热门文章

  1. 服务框架HSF分析之一容器启动
  2. Monitorix 2.6.0 发布,系统监控工具
  3. OPENSSH升级为7.4
  4. EasyUI TextBox的onkeypress事件
  5. jquery IE中同一个url第二次AJAX调用无法触发
  6. CentOs中mysql的安装与配置
  7. vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb
  8. USACO 1.5 Prime Palindromes
  9. 计算机网络机械特性是指,《计算机网络与通信》第1——3章 习题及思考题
  10. python三角网格代码_python中shapely的多多边形三角网格/网格