Leetcode(Java)-236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

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

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

示例 1:

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

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
 

说明:

所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int i = 0;
    HashMap<TreeNode,Integer> map = new HashMap<>();
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        init(root);
        return lowestSortedCommonAncestor(root,p,q);
    }

    public TreeNode lowestSortedCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
 
        // Value of current node or parent node.
        int parentVal = map.get(root);
 
        // Value of p
        int pVal = map.get(p);
 
        // Value of q;
        int qVal = map.get(q);
 
        if (pVal > parentVal && qVal > parentVal) {
            // If both p and q are greater than parent
            return lowestSortedCommonAncestor(root.right, p, q);
        } else if (pVal < parentVal && qVal < parentVal) {
            // If both p and q are lesser than parent
            return lowestSortedCommonAncestor(root.left, p, q);
        } else {
            // We have found the split point, i.e. the LCA node.
            return root;
        }
    }
    public void init(TreeNode root)//把二叉树初始化为二叉搜索树进行排序
    {
        if(root == null)
            return;

        init(root.left);
        map.put(root,i++);
        init(root.right);
    }
}
发布了241 篇原创文章 · 获赞 34 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38905818/article/details/104320614