树中两个节点的最低公共祖先

题目:输入一棵树的两个节点,返回他们的最低公共祖先。
当这棵树是二叉查找树时;
用递归从树的根节点开始遍历。

    private TreeNode find(TreeNode node1, TreeNode node2, TreeNode root) {
        int val=root.value;
        if(val>node1.value&&val>node2.value){
            return find(node1,node2,root.left);
        }
        if(val<node1.value&&val<node2.value){
            return find(node1,node2,root.right);
        }
        return root;
    }

如果这棵树只是一颗普通的树,但是拥有指向父节点的指针,
相当于求两个链表的第一个公共节点。


    private TreeNode find(TreeNode node1, TreeNode node2) {

        int a=0;
        int b=0;
        TreeNode nodea=node1;
        TreeNode nodeb=node2;
        while (node1!=null){
            node1=node1.parent;
            a++;
        }
        while(node2!=null){
            node2=node2.parent;
            b++;
        }
        if(a>b){
            for(int i=0;i<a-b;i++){
                nodea=nodea.parent;
            }
        }else if(b>a){
            for(int i=0;i<b-a;i++){
                nodeb=nodeb.parent;
            }
        }
        while (nodea!=null&&nodeb!=null){
            if(nodea==nodeb&&nodea.parent!=null){
                return nodeb;
            }
            nodea=nodea.parent;
            nodeb=nodeb.parent;
        }
        System.out.println("错误");
        System.exit(1);
        return null;
    }

如果这棵树只是一颗普通的树,用遍历的方法,遍历出每一条路径。

  public static TreeNode getLastCommonParent(TreeNode root,TreeNode p1,TreeNode p2){
        if(root==null||p1==null||p2==null){
            return null;
        }
        LinkedList<TreeNode> path1=new LinkedList<>();
        collectNode(root,p1,path1);
        LinkedList<TreeNode> path2=new LinkedList<>();
        collectNode(root,p2,path2);
        return getLastCommonNode(path1,path2);

    }

    private static TreeNode getLastCommonNode(LinkedList<TreeNode> path1, LinkedList<TreeNode> path2) {
        Iterator<TreeNode> it1= path1.iterator();
        Iterator<TreeNode> it2= path2.iterator();
        TreeNode last=null;
        while(it1.hasNext()&&it2.hasNext()){

            TreeNode tmp=it1.next();
            if(tmp==it2.next()){
                last=tmp;
            }
        }
        return last;
    }


    private static boolean collectNode(TreeNode root, TreeNode node, LinkedList<TreeNode> path) {

        if(root==node){
            return true;
        }
        path.add(root);
        for(TreeNode child:root.children){
            if(collectNode(child,node,path)){
                return true;
            }
        }
        //该条路径上没找到节点node就要从路径中移除

        path.removeLast();
        return false;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值