列表

详情


1650. 二叉树的最近公共祖先 III

给定一棵二叉树中的两个节点 pq,返回它们的最近公共祖先节点(LCA)。

每个节点都包含其父节点的引用(指针)。Node 的定义如下:

class Node {
    public int val;
    public Node left;
    public Node right;
    public Node parent;
}

根据维基百科中对最近公共祖先节点的定义:“两个节点 p 和 q 在二叉树 T 中的最近公共祖先节点是后代节点中既包括 p 又包括 q 的最深节点(我们允许一个节点为自身的一个后代节点)”。一个节点 x 的后代节点是节点 x 到某一叶节点间的路径中的节点 y。

 

示例 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,根据定义,一个节点可以是自身的最近公共祖先。

示例 3:

输入: root = [1,2], p = 1, q = 2
输出: 1

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/* // Definition for a Node. class Node { public: int val; Node* left; Node* right; Node* parent; }; */ class Solution { public: Node* lowestCommonAncestor(Node* p, Node * q) { } };

golang 解法, 执行用时: 4 ms, 内存消耗: 6.2 MB, 提交时间: 2023-10-16 21:45:51

/**
 * Definition for Node.
 * type Node struct {
 *     Val int
 *     Left *Node
 *     Right *Node
 *     Parent *Node
 * }
 */

func lowestCommonAncestor(p *Node, q *Node) *Node {
    var dfs func(*Node,*Node) bool
    dfs =func(pn *Node,qn *Node) bool{
        if pn==nil{
            return false
        }
        if pn.Val==qn.Val{
            return true
        }
        return dfs(pn.Left,qn) || dfs(pn.Right,qn)
    }
    for p!=nil{
        if dfs(p,q){
            return p
        }
        p  =p.Parent
    }
    return nil
}

python3 解法, 执行用时: 60 ms, 内存消耗: 20.5 MB, 提交时间: 2023-10-16 21:44:55

"""
# Definition for a Node.
class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None
        self.parent = None
"""
class Solution:
    def lowestCommonAncestor(self, p: 'Node', q: 'Node') -> 'Node':
        seen = set()
        queue = collections.deque([p, q])
        while queue:
            curr = queue.popleft()
            if curr in seen:
                return curr
            seen.add(curr)
            if curr.parent:
                queue.append(curr.parent)

java 解法, 执行用时: 28 ms, 内存消耗: 43.4 MB, 提交时间: 2023-10-16 21:44:37

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node parent;
};
*/
class Solution {
    public Node lowestCommonAncestor(Node p, Node q) {
        Set<Node> seen = new HashSet<>();
        while (p != null) {
            seen.add(p);
            p = p.parent;
        }
        while (q != null) {
            if (seen.contains(q)) {
                return q;
            }
            q = q.parent;
        }
        return null;
    } 
}

class Solution2 {
    public Node lowestCommonAncestor(Node p, Node q) {
        Node curP = p;
        Node curQ = q;
        while (curP != curQ) {
            curP = (curP == null) ? q : curP.parent;
            curQ = (curQ == null) ? p : curQ.parent;
        }
        return curP;
    } 
}

cpp 解法, 执行用时: 16 ms, 内存消耗: 10.4 MB, 提交时间: 2023-10-16 21:44:11

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* parent;
};
*/

class Solution {
public:
    Node* lowestCommonAncestor(Node* p, Node * q) {
        Node* point_p = p;
        Node* point_q = q;
        
        while (point_p != point_q) {
            point_p = point_p->parent ? point_p->parent : q;
            point_q = point_q->parent ? point_q->parent : p;
        }

        return point_p;
    }
};

上一题