-
求解二叉树题目的套路(树形dp)
- 列出所有可能性
- 需要从左子树和右子树获取哪些信息
- 定义递归函数返回的信息结构体
- 如果左右子树需要的信息不同,返回并集,因为递归返回的东西一定是相同的(搜索二叉树要同时返回最大值最小值)
- base case:如果是空树返回什么样的信息
- 递归调用获取左右子树返回的信息结构体
- 根据左子树右子树返回的信息结构体,求解自己的信息结构体
- 不是所有题目都可以用套路解,比如求解二叉树的中位数,但不可以用套路解的办法一般不可优化,一般不会出现
-
怎么判断一棵二叉树是否是搜索二叉树
- 左边的子树都比他小,右边的子树都比他大,就是搜索二叉树
- 一棵经典的搜索二叉树没有重复的数
- 使用中序遍历,升序就是搜索二叉树,否则就不是搜索二叉树
- 或者左子树是搜索二叉树,左子树最大值比他小,小于右子树最小值,右子树是搜索二叉树
-
怎么判断一棵树是一颗完全二叉树
- 二叉树按宽度遍历
- 不是完全二叉树的情况
- 如果遇到节点有右孩子没有左孩子,不是完全二叉树
- 遇到第一个左右孩子不双全的情况,接下来的点都是叶子节点,否则不是完全二叉树
-
怎么判断一棵树是否是一棵满二叉树
- 一种做法是统计这棵树的最大深度和节点个数,两者满足N=2^L - 1
- 向左子树和右子树收集高度和节点数
-
怎么判断一棵树是否是一棵平衡二叉树
- 左树和右树的高度差不超过1
- 左数是平衡二叉树,右树是平衡二叉树,两者的高度差不超过1
- 左子树需要的信息是是否是平衡二叉树以及高度,右子树需要的信息也是是否是平衡二叉树以及高度
- 定义递归函数返回的信息结构体
-
求解两个二叉树的节点node1和node2,找到他们的最低公共祖先节点
- 比较容易理解的做法
- 生成父节点表fatherMap,遍历(向下递归)的过程中填完
- 生成node1相关父节点链setO1
- 在父节点表中往上回溯,直到父亲等于自己(头节点)
- 再让node2往上回溯,每找到一个节点,检查是否在setO1中
- 比较简介的做法
- basecase:遇到空、o1、o2直接返回
- 左右子树遍历返回节点都不为空,返回当前节点
- 左右子树遍历返回节点存在空,返回不空的那个节点
- 情况讨论
- o1是o2的LCA,或o2是o1的LCA
- o1和o2不互为LCA,向上汇聚才找到
- 某一棵子树上既没有o1也没有o2,他一定返回空
- 如果是第一种情况,遇到较早的那个点就一直向上返回,得到正确答案
- 如果是第二种情况,首先让左右子树都不空的节点就是LCA,之后会一直向上返回
- 比较容易理解的做法
算法系列11——求解二叉树题目的递归套路
最新推荐文章于 2024-11-07 23:24:07 发布