leetcode 236. 二叉树的最近公共祖先

解决办法:

方法一: 

递归遍历 节点只能在左边或者右边,left 不为空,right为空,公共祖先是left;left为空,right不为空,公共祖先是right,left和right都不为空,公共祖先是root

方法二:

寻找两个节点的路径,找到第一个不相等的节点,返回上一个节点

代码:

public static void main(String[] args) {
        TreeNode treeNode1=new TreeNode(3);
        TreeNode treeNode2=new TreeNode(5);
        TreeNode treeNode3=new TreeNode(1);
        TreeNode treeNode4=new TreeNode(6);
        TreeNode treeNode5=new TreeNode(2);
        TreeNode treeNode6=new TreeNode(0);
        TreeNode treeNode7=new TreeNode(8);
        TreeNode treeNode8=new TreeNode(7);
        TreeNode treeNode9=new TreeNode(4);
        treeNode1.left=treeNode2;
        treeNode1.right=treeNode3;
        treeNode2.left=treeNode4;
        treeNode2.right=treeNode5;
        treeNode3.left=treeNode6;
        treeNode3.right=treeNode7;
        treeNode5.left=treeNode8;
        treeNode5.left=treeNode9;

        TreeNode treeNode = lowestCommonAncestor2(treeNode1, treeNode2, treeNode3);
        System.out.println(treeNode.val);
    }

    /**
     * @Description: 二叉树的最近公共祖先
     * 递归遍历 节点只能在左边或者右边,left 不为空,right为空,公共祖先是left;left为空,right不为空,公共祖先是right,left和right都不为空,公共祖先是root
     * @Date: 2020/2/9 22:55
     * @Author: fuguowen
     * @Return 
     * @Throws 
     */
    public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null){
            return null;
        }

        if(root==p || root==q){
            return root;
        }

        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if(left==null){
            return right;
        }
        if(right==null){
            return left;
        }
        if(left!=null && right!=null){
            return root;
        }
        return root;
    }

    /**
     * @Description: 二叉树的公共祖先
     * 解决方法: 寻找两个节点的路径,找到第一个不相等的节点,返回上一个节点
     * @Date: 2020/2/9 22:54
     * @Author: fuguowen
     * @Return 
     * @Throws 
     */
    public static TreeNode lowestCommonAncestor2(TreeNode root, TreeNode p, TreeNode q) {
        int[] flag=new int[1];
        LinkedList<TreeNode> pathList=new LinkedList<>();
        LinkedList<LinkedList<TreeNode>> resultList=new LinkedList<>();

        findParentNode(root,p,pathList,resultList,flag);
        pathList.clear();
        flag[0]=0;
        findParentNode(root,q,pathList,resultList,flag);
        int num;
        if(resultList.get(0).size()<resultList.get(1).size()){
            num=resultList.get(0).size();
        }else{
            num=resultList.get(1).size();
        }
        LinkedList<TreeNode> qResultList=resultList.get(1);
        LinkedList<TreeNode> pResultList=resultList.get(0);
        TreeNode parentNode=null;
        for(int i=0;i<num;i++){
            if(pResultList.get(i)==qResultList.get(i)){
                parentNode=pResultList.get(i);
            }else{
                break;
            }
        }

        return parentNode;
    }

    public static void findParentNode(TreeNode root, TreeNode p, LinkedList<TreeNode> pathList,
                               LinkedList<LinkedList<TreeNode>> resultList, int[] flag){

        if(root==null|| flag[0]==1){
            return ;
        }
        pathList.addLast(root);
        if(root.val==p.val){
            resultList.add(new LinkedList<>(pathList));
            flag[0]=1;
        }
        findParentNode(root.left,p,pathList,resultList,flag);
        findParentNode(root.right,p,pathList,resultList,flag);
        pathList.removeLast();

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值