剑指 Offer 68 - II. 二叉树的最近公共祖先

package leetcode;

import java.util.ArrayList;
import java.util.List;

public class offer_68_2 {
    //判断是否找出p和q
    boolean flag1=false;
    boolean flag2=false;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //l1存放p的路径
        List<TreeNode> l1=new ArrayList<TreeNode>();
        //l1存放q的路径
        List<TreeNode> l2=new ArrayList<TreeNode>();
        //从后往前找出两个链表之前的相同元素
        backtrack(root, l1, l2, p, q);
        int i=l2.size()-1;
        for(;i>=0;i--) {
            if(l1.contains(l2.get(i))) {
                return l2.get(i);
            }
        }
        
        return root;
    }
    public void backtrack(TreeNode root,List<TreeNode> l1,List<TreeNode> l2,TreeNode p,TreeNode q) {
        if(root==null) {return;}
        if(root.val==p.val) {
            l1.add(root);
            flag1=true;
        }
        if(root.val==q.val) {
            l2.add(root);
            flag2=true;
        }
        if(flag1==true&&flag2==true) {
            return;
        }else {
            if(flag1!=true) {
                l1.add(root);
            }
            if(flag2!=true) {
                l2.add(root);
            }
            backtrack(root.left, l1, l2, p, q);
            backtrack(root.right, l1, l2, p, q);
            if(flag1!=true) {
                l1.remove(l1.size()-1);
            }
            if(flag2!=true) {
                l2.remove(l2.size()-1);
            }
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        offer_68_2 off=new offer_68_2();
        TreeNode root=new TreeNode(3);
        Integer[] a= {3,5,1,6,2,0,8,null,null,7,4,null,null,null,null};
        root.CreateTree(root, a);
        off.lowestCommonAncestor(root, new TreeNode(5), new TreeNode(7));
    }
}

 

posted on 2022-03-20 16:30  一仟零一夜丶  阅读(31)  评论(0)    收藏  举报