1.树是什么?
树结构里的节点存在父子顺序结构,会有兄弟节点存在。这是数组结构不具备的。
最长用的二叉树:即每个父节点,有两个子节点:左孩子|右孩子
一般涉及到的概念:
深度 高度
2.树的种类
森林:好多树
树:从父节点引出多个子节点
二叉树:每个父节点只有两个子节点:左孩子和右孩子
满二叉树:从根往叶子,最大深度的倒数第二层,每个节点都有左孩子和右孩子,孩子总数为2^n-1。
完全二叉树:从根往叶子,最大深度的倒数第二层,每个节点都有左孩子和右孩子或是叶子节点。最大深度层的叶子节点总是紧贴在左侧。
二叉搜索树:对于所有中间节点,中间节点的值大于所有左子树的值,小于所有右子树的值。
中序遍历:严格(一定没有重复值)单调增的序列
注意:是和子树所有节点比值的大小,而不仅仅是左子树|右子树的根节点的值。
3.解决树问题的模板
树的遍历:
前中后序遍历+层级遍历,共四种。
前序遍历|先序遍历:对于树的每个节点总是先:中间节点、左子树、右子树顺序读取
中序遍历:对于树的每个节点总是先:左子树、中间节点、右子树顺序读取
后序遍历:对于树的每个节点总是先:左子树、右子树、中间节点顺序读取
层级遍历:从根节点开始,逐层读取
树问题解题关键三步
做题前先确定:遍历的话,使用哪种遍历方式
解题三步走:
1.确定返回值、方法参数
2.确定终止条件
3.确定单层递归逻辑
一般来说:解决树问题可以有两种解题方法,即递归和迭代
递归和迭代的区别:
递归:使用方法栈来记录当前节点状态及其他关键信息,深层递归容易栈溢出。
迭代:自定义栈来维护节点关键信息,模拟递归。可以解决部分栈溢出问题。
4.总结
二叉树算法解题捋思路过程:
1.什么遍历方式?
2.返回值和参数列表是什么?
3.递归的终止条件是什么?(先考虑递归解题思路)
4.单层递归逻辑是什么?
5.完善递归代码。递归不用自己用栈做维护,可以用来快速解题。
6.对性能有要求,可以将递归解题思路转迭代,用栈来维护节点的遍历顺序。