二叉树总结
红黑树就是一种二叉平衡搜索树。
每次要定义一个二叉树节点
java代码:
//二叉树节点的定义。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(){}
TreeNode(int val){
this.val = val;
}
TreeNode(int val,TreeNode left,TreeNode right){
this.val = val;
this.left = left;
this.right = right;
}
}
二叉树的递归遍历三步
1.确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么确定返回值的类型。
2.终止条件 :递归完成后,运行的时候,经常会遇见栈溢出的错误,就是没有写终止条件或者终止条件不正确,操作系统也是用一个栈的结构来保存递归的信息,如果递归没有终止的话,操作系统的内存栈必然会溢出。
3.确定单层递归的逻辑: 确定每一层递归需要处理的信息,也就会重复调用自己来实现递归的过程。
前序遍历 中序遍历 后序遍历
前序遍历:中 左 右
中序遍历:左 中 右
后续遍历:左 右 中
迭代遍历
递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各种参数,这就是递归可以返回上一层位置的原因。
前序遍历:迭代法
前序遍历遍历顺序是中 左 右,每次先处理中间节点,先将根节点入栈,然后将左孩子入栈,再加入右孩子。因为这样出栈的时候才是中左右顺序。
中序遍历:迭代法
中序遍历顺序是,左 中 右,先访问的是二叉树顶点的节点,然后一层一层向下访问,直到到达树的最底部,再开始处理节点。那么再使用迭代时,就要借助指针的遍历来帮助访问节点,栈则用来处理节点上的元素。
后续遍历:迭代法
后序遍历顺序是左 右 中,那就可以调整前序遍历的代码顺序,就变成了中右左,然后再反转结果数组,输出结果就是左右中了。
从时间复杂度来看迭代法和递归法差不多,但是空间复杂度上,递归的开销要大一点,因为递归需要系统堆栈存参数返回值等。
在实际项目开发的过程中我们是要尽量避免递归!因为项目代码参数、调用关系都比较复杂,不容易控制递归深度,甚至会栈溢出。
层序遍历
层序遍历一个二叉树,就是从左到右一层一层的去遍历二叉树。
这需要借助一个队列来实现,先进先出,符合一层一层遍历的逻辑,而是用栈适合模拟深度优先遍历也就是递归逻辑。
这种层序遍历方式就是图论中的广度优先遍历,只不过用在了二叉树上。
最大深度和高度
当使用前序求的时候就是深度,当使用后续求的时候就是高度。
根节点的高度就是二叉树的最大深度
最小深度
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
左右节点都为空的就是叶子节点。
求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。