先序:
中序:
后序:
递归序:
递归序中,每一个会有三次来到。、
先序:第一次来到打印,其他不管
就是图中1,2,3三个位置,三次回到自己
二、练习题
1、X在先序遍历中左边的集合与X在先序遍历中右边的集合取交集,是X的祖先节点
原因:
①先序遍历中,X所有祖先节点都在X左边,
后序遍历中,X所有祖先节点在X右边
②X所有的孩子节点,都不在交集内
③下图的情况一个在左一个在又
2、用非递归的方式实现二叉树的先序,中序,后序
先序遍历:
头右左:
中序:
3、实现二叉树的按层遍历
4、二叉树的序列化与反序列化
先序方式序列化:
先序方式反序列化:
中序方式不能序列化。
按层方式遍历序列化
按层方式遍历反序列化
4、将多叉树编码成二叉树
5、求二叉树中最宽的层有多少个节点
在宽度优先遍历的基础上,增加几个变量,标指每一层个数(增加nextend提前记录下一个变量,这种方法很常用)
这个题也可以用表来做:见代码
6、给你二叉树的某个节点,返回后继节点
后继节点:在中序遍历中,一个节点的下一个节点
方法一:根据给定节点的parent指针,找到二叉树的head节点,进行中序排序
缺点:时间复杂度O(n)
方法二:既然给了parent指针,想想从结构上找到后继节点
①X有右树,X的后继节点是X右树上的最左孩子
②X不断往上找,找到一个节点是父亲的左孩子,这个节点的父节点就是X的后继(X找是哪一个节点左树上的最右)
③都是左孩子,往上走一步,父节点就是后继节点
public static class Node {
public int value;
public Node left;
public Node right;
public Node parent;
public Node(int data) {
this.value = data;
}
}
public static Node getSuccessorNode(Node node) {
if (node == null) {
return node;
}
if (node.right != null) {
return getLeftMost(node.right);
} else { // 无右子树
Node parent = node.parent;
while (parent != null && parent.right == node) { // 当前节点是其父亲节点右孩子
node = parent;
parent = node.parent;
}
return parent;
}
}
public static Node getLeftMost(Node node) {
if (node == null) {
return node;
}
while (node.left != null) {
node = node.left;
}
return node;
}
7、将一张纸对着N次
从上往下打印这张二叉树折痕的方向,中序遍历。
这颗二叉树的规律:
①头结点是凹折痕
②所有左子树的头都是凹
③所有右子数的头都是凸的
8、判断二叉树是否是完全二叉树
按层遍历,
①有右无左false,
②当第一次遇到左右孩子不双全时,剩下遍历的节点,必须是叶
四、二叉树的递归套路
1、
背景:平衡二叉树,在每一颗子树里,左树的最大高度与右树的最大高度相差不超过1(每一个子树都要满足)
要想二叉树是平衡二叉树,要满足:
①X左子树 平衡二叉树
②X右子数 平衡二叉树
③X左高-X右高<2
递归,向你的左树要求什么 ,右树要求什么,自己就要满足什么
2、如何判断一个二叉树是搜索二叉树
搜索二叉树:每一个子树头结点,左树都比头小,右树都比头大
方法一:中序遍历来做
方法二:就想以X为头的数,他怎么才能数搜索二叉树
列可能性,可以像左树要某些信息,右树要某些信息了,搜索整合信息返回
所以求全值。
3、
距离:任何两个节点之间,用最精简的走法走到,中间节点的数量
使用递归套路:
目标:求X为头的情况下整棵树的最大距离
列可能性:距离与X无关①X左树的最大距离②X右树的最大距离
距离与X有关③X左树与X最远(左树高度)+X右树与X最远(右树高度)+1
对左右树提的要求:最大距离,高度
最终结果就是三种可能性中求max
4、判断一棵树是否是满二叉树。
满二叉树,二叉树的高度是h,那么满二叉树的节点数是2^h-1
以X为头结点,需要收集h以及n节点数
5、整颗二叉树中,有哪些子树是搜索二叉树,找出整颗数上搜索二叉树中节点最多的子树,返回节点数
目标:X节点为头的情况下,最大满足搜索二叉树的子树有多大
列可能性:X不做头:①左边max②右边max
X作头①左 Bst?②右 Bst? ③左树的最大值小于X④ 右min>X⑤左size,右size+1
二叉树递归套路总结:
左边得到三个信息,右边得到三个信息,整合好三个信息往上。树形DP
不管什么题都想以X为头,目标怎么实现,列可能性是最重要的,左树要来简单信息,右树要来简单信息,能加工出来信息。
常见分类:目标有X,目标无X
为NULL好设置就设置,不好设置就上层处理
6、判断二叉树是否完全二叉树
目标:以X节点为头的二叉树,是否满足完全二叉树
可能性:
要什么信息: 树满不满,高度,完全二叉树
7、自己练
8、
最低公共祖先即第一次相交的点
方法一:递归遍历二叉树,用map来记录每个节点的父节点。把a向上跳的头结点加入到set中去,b向上找的过程中如果出现了头结点在a中有就是这个节点。
方法二:二叉树递归的套路
目标:X这颗树上,a,b最初汇聚在哪?
列可能性:汇聚点和X无关 ①左树上有答案②右树上有答案③X的整颗树上a,b不全
汇聚点和X有关①X作为答案,左树发现一个,右树发现另一个,在x这里最终汇聚
②X本身就是a节点,左树或者右树发现了b
信息:是否发现a 是否发现b 是否有ab汇聚的最低公共祖先
9、
目标:以X为头的整颗树,获得的最大值happy是多少
列可能性:①X来时整棵树最大值②X不来时整棵树最大值