遇到null就会返回到自己,所以可以在2和3处加上想要做的操作。
每个节点都会出现三次
树的先序遍历: 遇到第一个节点就打印
二叉树的遍历
任何递归都可以用非递归的形式实现。先把第一个节点放进去
中序':是先压左再压右
通过中序' 实现栈的后序遍历
宽度优先遍历:利用队列先放左再放右
宽度优先遍历代码
通过宽度优先遍历求二叉树的宽度.
不使用hash表,来求宽度,只利用几个变量循环遍历
搜索二叉树就是每一个节点的左子树都比它小,右子树都比它大。一颗经典的搜索树是没有重复值的。
如何判断一颗二叉树是否是搜索二叉树?
使用中序遍历,然后看是否顺序是升序的。
下面是 ,换成比较时机。
上图更傻白甜的代码
非递归的代码修改
如何判断一棵树是否是完全二叉树。使用宽度遍历
满二叉树肯定满足的规则
平衡二叉树:任何一个节点,它左树的高度和它右树的高度之差不能超过1
分析判断左右子树的条件,发现所需条件相同。左右子树条件都相同
判断是平衡二叉树的第二种方式
判断是否是满二叉树
树型DP(每一个节点都需要左树信息和右树信息)都可以用以上方法求解
最低公共祖先就是两个节点最先汇聚到哪个节点。E和F的公共祖先是汇聚到E,E就是公共祖先
第二种方法
情况1:
情况二:
做了大量的优化:
后继节点指的是中序遍历中,遍历节点的后面节点
分析思路:现在已知树的节点是有指向父亲的指针,如果使用中序遍历确定其后继节点,那么每次都需要O(N)的时间复杂度。
从树的结构上来看,其实我们知道每个节点的父节点。通过父节点指针,如E走两步就知道自己的后继节点为A。如果每个节点算k步的话,时间复杂度为O(k)。如何从树的结构上找到每个节点的后继节点是关键。
x在有右树的时候,x右树最左侧的节点一定是它的后继
x没有右树时,就往上看,看是不是某个节点的左子树
用先序遍历 序列化二叉树。遇到一个值就打印加一个下划线。null打印为#。以什么方式序列化就用什么方式反序列化
微软原题:
训练敏感程度!每一道题都来自于基础。问题是什么基础。