【Leetcode】Lowest common treenode in binary tree

本文探讨了在二叉树中寻找两个指定节点的最低公共祖先(LCA)的问题,并提供了两种解决方案。一种是通过使用哈希映射记录每个节点及其父节点来形成路径,另一种则是递归地遍历左右子树。

【题目】

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

        _______3______
       /              \
    ___5__          ___1__
   /      \        /      \
   6      _2       0       8
         /  \
         7   4

For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

 

【思路】

方法一:

这道题和BST相似,但不如那个容易解决,因为没有BST的性质。

use a map to save the node and its parent,then use this map to form the route of p,finally let the q goes up when it touches the route.

用map先把每个节点的根节点记录下来,遍历tree的方法用的是BFS。所以要加一个queue;

都存下来以后。根据这个map获得p的路径,将p的所有祖先放在set里面。

然后在用q 的根进行检测。如果有就是了~

【代码】

public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    HashMap<TreeNode,TreeNode> m = new HashMap<TreeNode,TreeNode>();
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    queue.offer(root);
    while(queue.peek()!=null){
        TreeNode t = queue.poll();
        if(t.left!=null){
            m.put(t.left,t);
            queue.offer(t.left);
        }
        if(t.right!=null){
            m.put(t.right,t);
            queue.offer(t.right);
        }
    }
    Set<TreeNode> l = new HashSet<TreeNode>();
    TreeNode pp = p;
    while(pp!=root){
        l.add(pp);
        pp = m.get(pp);
    }
    l.add(root);
    TreeNode qq = q;
    while(!l.contains(qq)){
        qq = m.get(qq);
    }
    return qq;
}

方法二;



Just blind try left and right. Then if we find in both left and right side return root, otherwise return the one we got.


  if (root == p || root == q || root == null) { return root; }
    TreeNode left = lowestCommonAncestor(root.left, p, q);
    TreeNode right = lowestCommonAncestor(root.right, p, q);
    return (left != null && right != null) ? root : (left != null ? left : right);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值