美文网首页
面试题68(剑指offer)--树中两个节点的最低公共祖先

面试题68(剑指offer)--树中两个节点的最低公共祖先

作者: Tiramisu_b630 | 来源:发表于2019-08-15 21:37 被阅读0次

题目:

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。最低公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例:

输入: 
root = [4,2,1,3,5,7], p = 3, q = 1
输出: 2
解释: 节点 3 和节点 1 的最近公共祖先是节点 2。

思路:

利用递归遍历找到分别到两个目标点的路径,然后遍历两个路径,两个路径中最后一个相等的元素就是最低的公共祖先。

代码:

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root==p||root==q||root==null){
            return root;
        }
        List<TreeNode> list=new ArrayList<>();
        List<TreeNode> resList=new ArrayList<>();//存根节点到目标点的路径
        preOrder(root,p,list,resList);
        int pLen=resList.size();
        List<TreeNode> pList=new ArrayList<>();
        for (int i = 0; i < pLen; i++) {
            pList.add(resList.get(i));
        }
        resList.clear();
        list.clear();
        preOrder(root,q,list,resList);
        int qLen=resList.size();
        TreeNode resNode=null;
        for (int i = 0; i < qLen; i++) {
            if (i<pList.size()&&pList.get(i)==resList.get(i)){
                resNode=pList.get(i);//找到最后一个相等的点
                continue;
            }else {
                break;
            }
        }
        return resNode;
    }
    private void preOrder(TreeNode root,TreeNode target,List<TreeNode> list,List<TreeNode> resList){
        if (root==null){
            return;
        }
        list.add(root);
        if (root==target){
            for (TreeNode treeNode : list) {
                resList.add(treeNode);
            }
            return;
        }
        preOrder(root.left,target,list,resList);
        preOrder(root.right,target,list,resList);
        list.remove(root);
    }

相关文章

网友评论

      本文标题:面试题68(剑指offer)--树中两个节点的最低公共祖先

      本文链接:https://www.haomeiwen.com/subject/rmgtsctx.html