​​0️⃣python数据结构与算法学习路线​​

学习内容:

  • 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…
  • 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等…

目录

  • ​​树的定义和基本术语​​
  • ​​思维导图​​
  • ​​名词定义​​
  • ​​树的分类​​
  • ​​普通的树​​
  • ​​==空树:==​​
  • ​​==非空树:==​​
  • ​​==有序树:==​​
  • ​​==无序树:==​​
  • ​​==二叉树:==​​
  • ​​二叉树的性质​​
  • ​​二叉树的存储​​
  • ​​二叉树的先序 中序 后序遍历​​
  • ​​二叉树的层序遍历​​
  • ​​二叉树的遍历序列构造二叉树​​
  • ​​==霍夫曼树:==​​
  • ​​==b树:==​​
  • ​​特殊二叉树​​
  • ​​==满二叉树(Full Binary Tree):==​​
  • ​​==完全二叉树 (Complete Binary Tree):==​​
  • ​​==二叉排序树==​​
  • ​​==平衡二叉树==​​
  • ​​易混的定义​​
  • ​​参考文章:​​

树的定义和基本术语

思维导图

【Leetcode】python树_二叉树

名词定义

【Leetcode】python树_面试_02


树的结点树=总度数+1(加一个根节点)

树的度:最大节点的度

子树:

【Leetcode】python树_面试_03

树的分类

普通的树

空树:

没有根节点的树

非空树:

【Leetcode】python树_算法_04


除了根节点之外,有且只有一个前驱(不满足这个条件的应该称之为网或者图)

有序树:

树的各个子树的顺序是固定的,不能随意改变顺序。

无序树:

树的各个子树的顺序可变。

二叉树:

每个节点最多只能有两个子节点的树称为二叉树(参考m叉树的定义),二叉树是有序树,左右子树的顺序不能改变。二叉树又可以分为满二叉树和完全二叉树。

【Leetcode】python树_二叉树_05

二叉树的性质


【Leetcode】python树_算法_06


2.

【Leetcode】python树_树结构_07


证明:

【Leetcode】python树_树结构_08


3.

【Leetcode】python树_树结构_09


证明过程

【Leetcode】python树_面试_10

二叉树的存储

【Leetcode】python树_树结构_11


顺序存储: 从上到下,从左到右,顺序存储到数组中

查找孩子和父亲的方法(完全二叉树),这里面的编号是从1开始而不是从0开始

【Leetcode】python树_算法_12


普通的二叉树使用顺序存储:

【Leetcode】python树_数据结构_13


不只是按顺序去存储,而是对应完全二叉树的编号方法进行排序,将没有结点的位置空出来(造成了内存浪费)

链式存储:

【Leetcode】python树_面试_14


【Leetcode】python树_面试_15


每个节点有三个域 —— 数据域,左儿子指针域,右兄弟指针域

二叉树的先序 中序 后序遍历

【Leetcode】python树_面试_16


树的使用是递归的,每一步都是由前一步结果决定

判断顺序

【Leetcode】python树_数据结构_17


【Leetcode】python树_算法_18


【Leetcode】python树_面试_19


【Leetcode】python树_面试_20

二叉树的层序遍历

一层一层的遍历

【Leetcode】python树_树结构_21


算法实现:

【Leetcode】python树_二叉树_22

二叉树的遍历序列构造二叉树

只给一种遍历序列会可以对应多个二叉树

【Leetcode】python树_面试_23

霍夫曼树:
b树:

特殊二叉树

【Leetcode】python树_二叉树_24

满二叉树(Full Binary Tree):

除了叶子结点都有两个结点的二叉树

【Leetcode】python树_数据结构_25


【Leetcode】python树_算法_26


例:6的左孩子是12,右孩子是12+1,父节点是3(i是左孩子的话)

使用这个性质进行存储

完全二叉树 (Complete Binary Tree):

满二叉树是完全二叉树的一种特殊情况。如果去掉满二叉树中编号比较大的叶子结点就是完全二叉树

【Leetcode】python树_二叉树_27


【Leetcode】python树_树结构_28


解释一下4:1-6是分支节点 7开始是叶子结点

例:

去掉15是完全二叉树,去掉14 15也是完全二叉树,去掉13 14 15还是完全二叉树。

但是如果我们只去掉13就不是完全二叉树,因为这个时候原来编号为14的叶子结点就会变成13,和满二叉树的编号不一样了,只去掉14也不是完全二叉树。(其实就是得按从后往前的顺序全都去掉的满二叉树才是完全二叉树)

二叉排序树

左子树的所有结点小于根节点
右子树的所有结点大于根节点
用来排序查找很方便

平衡二叉树

任何一个结点的左子树和右子树的深度之差不超过1

平衡二叉树相对于不平衡的二叉树就有更高的搜索效率

例:这是一颗平衡二叉树

【Leetcode】python树_数据结构_29


50的两个子树一个高度2,一个高度3,不超过1

66的两个子树一个1,一个2,也不超过1

所以满足条件

【Leetcode】python树_二叉树_30


这颗二叉树就不平衡

易混的定义

1.度为m说明他至少有一个结点是度为m

【Leetcode】python树_算法_31


2.

【Leetcode】python树_二叉树_32

参考文章:

​​数据结构基础知识​​:c++实现
​​《数据结构与算法之美》学习汇总​​:C++实现
​python数据结构​​:python实现