Lowest Common Ancestor of a Binary Tree Leetcode
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.
这道题我应该是做过的。。。然而一开始还是没做出来。。。究其原因,就是一开始就用了stack而没有往递归的方向想,用递归是最简单的。
最近树的题目真的是生疏了,要多加练习才好。
这里有个需要注意的地方就是,比较的时候一定要TreeNode直接比较,不要比较val,因为给的就是treenode,要treenode相等才是相等,不是值相等就是相等,因为还会有值一样的情况,这样就很难办。
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null) { return null; } if (root == p || root == q) { return root; } TreeNode left = lowestCommonAncestor(root.left, p, q); TreeNode right = lowestCommonAncestor(root.right, p, q); if (left != null && right != null) { return root; } if (left == null && right != null) { return right; } if (left != null && right == null) { return left; } return null; } }
但这个代码写的其实蛮冗余的,可以这样写
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null || root == p || root == q) { return root; } TreeNode left = lowestCommonAncestor(root.left, p, q); TreeNode right = lowestCommonAncestor(root.right, p, q); if (left != null && right != null) { return root; } return left == null ? right : left; } }
以后写完还是要自己多改改。