代码随想录-64-236. 二叉树的最近公共祖先
前言
我在刷卡哥的“代码随想录”,自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接
题目
1.后序遍历回溯思想(从下到上找祖先节点)
递归三部曲:
- 参数和返回值
- 参数: root节点,p节点,q节点
- 返回值:TreeNode类型变量(如果找到p或者q节点)
- 终止条件
- root节点为null,或者如果p节点是root节点,或者如果q节点是root节点,则都返回root节点。
- 单层循环条件
- 遍历左孩子,并用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. 算法坑点
暂无