《左神算法初级班》第四节课:二叉树结构
作者:互联网
目录:
1)二叉树结构
2)二叉树的递归与非递归遍历
3)打印二叉树
4)判断搜索二叉树
5)判断完全二叉树
6)判断平衡二叉树
7)折纸问题
8)二叉树节点的前驱节点与后继节点
9)二叉树的序列化和反序列化
- 面对二叉树的题目,高度套路化处理。
- 二叉树递归很好用。每个节点都要遍历三次,甭管是什么序遍历。先来到x,左子树转一圈再回到x,右子树转一圈再回到x。
题目一:实现二叉树的先序、中序、后序遍历,包括递归方式和非递归 方式
- 很多题目都是根据二叉树的遍历来的
- 先序遍历:先打印根节点,再打印整棵左子树,再打印整棵右子树的过程
- 递归很重要。要明白依次访问节点的顺序(忽略打印行为)(每个节点都被访问了三次)
- 如果把打印的时机放在第一次遍历的时候,就是先序遍历;如果把打印的时机放在第二次遍历的时候,就是中序遍历;如果把打印的时机放在第三次遍历的时候,就是后序遍历。
//三种遍历:递归
//三种遍历:非递归
题目二:如何直观的打印一颗二叉树
- 福利函数
在这里插入代码片
题目三:在二叉树中找到一个节点的后继节点
- 后继节点和前驱节点都是中序遍历后的产物。
//找某个节点的后继节点
//找某个节点的前驱节点
题目四:介绍二叉树的序列化和反序列化
- 一棵树在连的过程中,是在内存中的。
- 要保存在文件中,记录下来,以便下次重建。
- 序列化:持久化。 记录的过程。序列化时,空也要记录,可以用特定的符号。
- 反序列化:重建的过程。
- 序列化和反序列化有两种:先序中序后序、层序
- 怎么序列化的,就怎么反序列化。同时要注意空节点的处理。
//先序序列化
//先序反序列化
//层序序列化
//层序反序列化
题目五:折纸问题
在这里插入代码片
题目六:判断一棵二叉树是否是平衡二叉树
- 平衡二叉树:要么是一棵空树,要么是对于树中的任何节点,左子树和右子树的高度差不超过1。
- 满二叉树一定是平衡二叉树。
- 写递归时,要注意左子树和右子树转一圈后的返回信息。这递归返回信息包括:是否平衡、高度。
- 树形DP。
//递归
题目七:判断一棵树是否是搜索二叉树、判断一棵树是否是完全二叉树
- 搜索二叉树BST:任何节点的左子树都比它小,右子树都比它大。通常是不出现重复节点的(没必要,可以写次数)。中序遍历来判断,看是否是BST。
- 完全二叉树:堆的结构。二叉树按层遍历。
判断逻辑很简单,但是不好想:
- 按层遍历二叉树,从每层的左边向右边依次遍历所有的节点。
- 如果一个节点有右孩子无左孩子,那一定不是完全二叉树。
- 如果无右孩子,两种可能,一种是左右都没有,一种是只有左(左右孩子不全)。则要开始“叶节点”的阶段,之后遍历到的节点必须是叶节点。
- 则是完全二叉树。
//中序遍历的非递归程序改两行代码即可。
//判断一棵树是完全二叉树
题目八:已知一棵完全二叉树,求其节点的个数
要求:时间复杂度低于O(N),N为这棵树的节点个数。
- 如果一棵树是满二叉树,高度为l,则总节点个数为2l-1。
- O(N)来计算完全二叉树的总节点:
- 看根节点的左子树多高,看右子树能不能到左边界。如果其右子树的左边界到了最后一层,则证明其左子树是满二叉树,可以根据满二叉树的公式来计算左子树的总节点数;如果没到最后一层,则“右子树”是满二叉树,只不过高度-1。
- 总之,总有一边可以用满二叉树的公式来求节点数,另一边就用递归。
在这里插入代码片
标签:左子,遍历,递归,左神,二叉树,序列化,节点,初级班 来源: https://blog.csdn.net/gx17864373822/article/details/114983256