算法系列11——求解二叉树题目的递归套路

  • 求解二叉树题目的套路(树形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,之后会一直向上返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值