在二叉树中找到两个节点的最近公共祖先

刚开始我的思路是用两个ArrayList集合去记录从根节点找到两个目标节点的路径,最终去遍历两个数组最后一个相交的节点就是他们的父节点,但是这个消耗内存很大,效率不是很高,我看到别人的另一种递归方法于是就学习

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
     boolean find = false;
     ArrayList<Integer> or1 = new ArrayList<Integer>();
     ArrayList<Integer> or2 = new ArrayList<Integer>();
    
    public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
       return sol(root,o1,o2).val;

    }
    public TreeNode sol(TreeNode root, int o1, int o2){
       if(root == null || root.val == o1 || root.val == o2)return root; //返回条件
       TreeNode left = sol(root.left,o1,o2);
       TreeNode right = sol(root.right,o1,o2);
       if(left == null )return right; //这里要记住的是我们要的是找到目标节点所以如果他的左子树找不到目标节点则返回它的右子树,如果右子树为空则同理
       if(right == null )return left;
//如果左右子树都能找到目标值,说明该节点就是根节点
       return root; 
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值