0️⃣python数据结构与算法学习路线
学习内容:
- 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…
- 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等…
目录
树的定义和基本术语
思维导图
名词定义
树的结点树=总度数+1(加一个根节点)
树的度:最大节点的度
子树:
树的分类
普通的树
空树:
没有根节点的树
非空树:
除了根节点之外,有且只有一个前驱(不满足这个条件的应该称之为网或者图)
有序树:
树的各个子树的顺序是固定的,不能随意改变顺序。
无序树:
树的各个子树的顺序可变。
二叉树:
每个节点最多只能有两个子节点的树称为二叉树(参考m叉树的定义),二叉树是有序树,左右子树的顺序不能改变。二叉树又可以分为满二叉树和完全二叉树。
二叉树的性质
2.
证明:
3.
证明过程
二叉树的存储
顺序存储: 从上到下,从左到右,顺序存储到数组中
查找孩子和父亲的方法(完全二叉树),这里面的编号是从1开始而不是从0开始
普通的二叉树使用顺序存储:
不只是按顺序去存储,而是对应完全二叉树的编号方法进行排序,将没有结点的位置空出来(造成了内存浪费)
链式存储:
每个节点有三个域 —— 数据域,左儿子指针域,右兄弟指针域
二叉树的先序 中序 后序遍历
树的使用是递归的,每一步都是由前一步结果决定
判断顺序
二叉树的层序遍历
一层一层的遍历
算法实现:
二叉树的遍历序列构造二叉树
只给一种遍历序列会可以对应多个二叉树
霍夫曼树:
b树:
特殊二叉树
满二叉树(Full Binary Tree):
除了叶子结点都有两个结点的二叉树
例:6的左孩子是12,右孩子是12+1,父节点是3(i是左孩子的话)
使用这个性质进行存储
完全二叉树 (Complete Binary Tree):
满二叉树是完全二叉树的一种特殊情况。如果去掉满二叉树中编号比较大的叶子结点就是完全二叉树
解释一下4:1-6是分支节点 7开始是叶子结点
例:
去掉15是完全二叉树,去掉14 15也是完全二叉树,去掉13 14 15还是完全二叉树。
但是如果我们只去掉13就不是完全二叉树,因为这个时候原来编号为14的叶子结点就会变成13,和满二叉树的编号不一样了,只去掉14也不是完全二叉树。(其实就是得按从后往前的顺序全都去掉的满二叉树才是完全二叉树)
二叉排序树
左子树的所有结点小于根节点
右子树的所有结点大于根节点
用来排序查找很方便
平衡二叉树
任何一个结点的左子树和右子树的深度之差不超过1
平衡二叉树相对于不平衡的二叉树就有更高的搜索效率
例:这是一颗平衡二叉树
50的两个子树一个高度2,一个高度3,不超过1
66的两个子树一个1,一个2,也不超过1
所以满足条件
这颗二叉树就不平衡
易混的定义
1.度为m说明他至少有一个结点是度为m
2.
参考文章:
数据结构基础知识:c++实现
《数据结构与算法之美》学习汇总:C++实现
python数据结构:python实现