递归遍历树:
递归序每个值都会出现3次
先序遍历:
由递归序得来,递归序中第一次到每个数就打印,后面到的啥都不干
中序遍历:
由递归序得来,递归序中第二次到每个数就打印,后面到的啥都不干
后序遍历:
由递归序得来,递归序中第三次到每个数就打印,后面到的啥都不干
非递归遍历树:
先序遍历
准备一个栈,把头节点放入栈,接下来步骤如下:
后序遍历
先序是:头左右,如果弄出先序’:头右左,弹出不打印,放入辅助栈,再弹出辅助栈的每一个并打印,得到后序
中序遍历:
中序遍历:左右头,
完成二叉树的宽度优先遍历
宽度遍历用队列:先把头放进队列,弹出就打 印,先放左再放右
常见题目:求二叉树的宽度
二叉树的相关概念及其实现判断
1、
用中序遍历,得到的序列如果是升序就是搜索二叉树
递归版:
非递归版:
2、如何判断一棵二叉树是完全二叉树
二叉树按宽度遍历,如果:(1)任一节点有右孩子没有左孩子,直接返回false。(2)在(1)不违反的情况下,如果遇到了第一个左右孩子不双全的情况,那么接下来所有节点都必须是叶节点
3、如何判断一棵二叉树是满二叉树
满二叉树满足:
4、如何判断一棵二叉树是平衡二叉树
二叉树题目解题套路总结:(树形DP)
假设可以向左、右树要信息à罗列可能性(每种可能性成立的条件是啥)à可能性固定,去整理需要左树右树什么信息(这些信息决定结构体)。
判断是否平衡二叉树
- 可能性只有一种(左边圈圈的)
- 满足这一种可能性需要的条件为左边的与起来都成立,需要的信息为右边圈圈里的内容。
- 因为需要的信息为是否平衡、高度是多少,所以结构体(递归函数返回值)定义如下:
完整代码
- 在调用递归的时候要获得三个字,返回的时候也要返回三个值
判断二叉树是否搜索二叉树:
- 罗列可能性(条件):左树是搜索二叉树、右树是搜索二叉树、左树max<头节点、右树min>X
- 需要左树右树什么信息:左树是否搜索二叉树以及最大值、右树是否搜索二叉树及最小值
- 虽然左树和右树要求不一样了,但因为是递归套路,所以对每一个节点要求一样,所以不管是左右,一律返回三个信息
- 结构体(递归返回值)定义:
判断是否满二叉树