【树】面试题 04.08. 首个共同祖先
题目:
设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
3
/ \
5 1
/ \ / \
6 2 0 8
/ \
7 4
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
解答:
class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null) { return null; } TreeNode left = lowestCommonAncestor(root.left, p, q); TreeNode right = lowestCommonAncestor(root.right, p, q); //如果根节点是p,q中的一个,根节点就是首个共同祖先 if(root == p || root == q) { return root; }else { //如果p,q分散在左右子树中,那么根节点就是首个共同祖先 if(left != null && right != null) { return root; } //否则,共同祖先就在左子树或者右子树中 if(left != null || right != null) { return left != null ? left : right; } } return null; } }

浙公网安备 33010602011771号