理论基础
1、分类
满二叉树
完全二叉树
二叉搜索树
平衡二叉搜索树
2、存储方式
链式存储:链表存储。节点除了存储数据,还存了指向左右节点的指针
线式存储:列表存储。按照数组从上到下从左到右,存储在列表中。
3、遍历
①深度优先搜索(DFS):可用迭代法或递归法遍历
前序遍历:中左右--->先访问中心节点,然后左子树,全部访问完后,访问右子树。
访问结果:1245367
中序遍历:左中右:4251673
后序遍历:左右中:4526731(只要有左就一直向左)
序指的是遍历根节点的顺序。
②广度优先搜索(BFS):可用迭代法遍历。
理解非常片面,后面结合题目再理解
4、定义
一般是用链表进行定义(对应链式存储),定义方式如下:
class TreeNode:
def __init__(self, val, left = None, right = None):
self.val = val
self.left = left
self.right = right
二叉树第一次接触,不好理解。看看刷完题会不会有更深的理解
递归遍历
哎呀递归,理解非常不透彻,感觉像个黑盒子,如懂。
卡哥总结的写递归法的三要素,上次我自己好像也总结了,但是没有找到。大概就是把for/while循环的单层拎出来写成一个函数,将函数输出再次作为函数的输入,直至满足终止条件。
卡哥的递归写法三要素:
①确定输入输出参数
②确定终止条件
③确定单层循环要完成的内容
递归法遍历,就是两重链表的查询元素。主要是这三句的出现顺序,就是节点的遍历顺序:(前中后序遍历,都是深度优先搜索dfs)
res.append(node.val)#当前根节点的值
dfs(node.left)#此根节点的左子树
dfs(node.right)#此根节点的右子树
迭代遍历
统一迭代
总之理解都不太深,很难理解输入数组和存储的方式的关系。还有之前隐约接触一点的满二叉搜索数,为什么是对sorted的数组进行存储也不太好理解。因此迭代法先跳过,之后全部都是用递归法来编程。