代码随想录-64-236. 二叉树的最近公共祖先

目录

  • 前言
    • 题目
    • 1.后序遍历回溯思想(从下到上找祖先节点)
      • 全局变量
    • 2. 本题思路分析:
    • 3. 算法实现
    • 4. 算法坑点

前言

我在刷卡哥的“代码随想录”,自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接

题目

代码随想录-64-236. 二叉树的最近公共祖先_第1张图片
代码随想录-64-236. 二叉树的最近公共祖先_第2张图片

1.后序遍历回溯思想(从下到上找祖先节点)

递归三部曲:

  1. 参数和返回值
  • 参数: root节点,p节点,q节点
  • 返回值:TreeNode类型变量(如果找到p或者q节点)
  1. 终止条件
  • root节点为null,或者如果p节点是root节点,或者如果q节点是root节点,则都返回root节点。
  1. 单层循环条件
  • 遍历左孩子,并用TreeNode接收返回值
  • 遍历右孩子,并用TreeNode接收返回值
  • 处理中间节点逻辑,
    - 如果左孩子和右孩子都不为null,则返回当前节点(相当于当前节点就是最近公共祖先节点);
    - 如果左孩子为null并且右孩子不为null,则返回左孩子节点
    - 如果右孩子为null并且左孩子不为null,则返回右孩子节点
    - 否则直接返回null

全局变量

HashMap<Integer,Integer> table = new HashMap<>();//记录节点的值和它对应出现的次数
int max = Integer.MIN_VALUE;//当前遍历节点中的最大值

2. 本题思路分析:

使用前中后序遍历,递归遍历均可。
这里选择了中序遍历实现。
每次遍历时,将当前遇到的节点值与次数插入到HashMap对象中,如果HashMap之前不存在就以key创建一个键值对,值为1(第一次出现);如果存在,就就在对应值上+1。
并且每次判断是否更新节点的最大值max。
最后遍历map对象,将元素加入到ArrayList对象中,并且最后将ArrayList对象中的元素加入到int[]数组中。

3. 算法实现

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || p == root || q == root){
            return root;
        }
        //后序遍历
        TreeNode left = lowestCommonAncestor(root.left,p,q);//左子树递归
        TreeNode right = lowestCommonAncestor(root.right,p,q);//右子树递归
        //中间节点处理
        if(left != null && right != null){
            return root;//说明此节点就是最近公共祖先节点
        }
        if(left != null && right == null){
            return left;//
        }
        if(left == null && right != null){
            return right;//
        }
        return null;
    }
}

4. 算法坑点

暂无

你可能感兴趣的:(java,算法,开发语言)