最小公共祖先 IV

题目: 给定两个节点,求它们在一个普通树中的最小公共祖先。

思路: 采用广度优先遍历找到节点,将所有节点父节点存入哈希表,当找到节点时回溯哈希表实现到树根的路径。找两条路径的交点。

java代码:

class TreeNode{
        int val;
        ArrayList<TreeNode> children;
    }
    TreeNode LCA4(TreeNode root,TreeNode p,TreeNode q){
        if(root==null||p=null||q==null)
            return null;
        Queue<TreeNode> currLevel=new LinkedList<TreeNode>();
        Queue<TreeNode> nextLevel=new LinkedList<TreeNode>();
        currLevel.offer(root);
        Queue<TreeNode> pp=new LinkedList<TreeNode>();
        Queue<TreeNode> qq=new LinkedList<TreeNode>();
        HashMap<TreeNode,TreeNode> backTracking=new HashMap<TreeNode,TreeNode>();
        while(!currLevel.isEmpty()){
            while(!currLevel.isEmpty()){
                nextLevel=new LinkedList<TreeNode>();
                TreeNode node=currLevel.poll();
                for(TreeNode child: node.children){
                    backTracking.put(child,node);
                    if(child==p){
                        addParent(pp,p,backTracking);
                    }else if(child==q){
                        addParent(qq,q,backTracking);
                    }
                    if(!pp.isEmpty()&&!qq.isEmpty()){
                        return getLCA(pp,qq);
                    }else{
                        nextLevel.offer(child);
                    }
                }
            }
            currLevel=nextLevel;
        }
        return null;
    }
    void addParent(Queue<TreeNode> Que,TreeNode q,HashMap<TreeNode,TreeNode> bt){
        TreeNode parent=bt.get(q);
        while(parent!=null){
            Que.addFirst(parent);
            parent=bt.get(parent);
        }
    }
    TreeNode getLCA(Queue<TreeNode> pp,Queue<TreeNode> qq){
        TreeNode result=null;
        while(!pp.isEmpty()&&!qq.isEmpty()){
            TreeNode pParent=pp.poll();
            TreeNode qParent=qq.poll();
            if(pParent==qParent){
                result=pParent;
            }else{
                break;
            }
        }
        return reault;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值