问题:
解题:
分析:需要遍历二叉树,也不仅仅是遍历,需要判断自己的子是不是包含目标节点,判断自己和目标节点是不是相同,相同的问题,要一层一层重复判断,那么得用递归,递归的判断条件想全不容易,多试试吧
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
rootContainsP_Or_Q(root, p, q);
return this.node;
}
private TreeNode node;
private boolean rootContainsP_Or_Q(TreeNode root, TreeNode p, TreeNode q) {
// 终止条件
if (null == root) {
return false;
}
// 判断一下是不是子节点包含p和q
boolean leftContains = rootContainsP_Or_Q(root.left, p, q);
boolean rightContains = rootContainsP_Or_Q(root.right, p, q);
// 都在子节点 一个在子节点一个是本身
if (leftContains && rightContains || (root.val == p.val || root.val == q.val) && (leftContains || rightContains)) {
// 说明找到了
this.node = root;
}
return leftContains || rightContains || root.val == p.val || root.val == q.val;
}
}
性能:
减少判断中的括号,可以提升速度,虽然提升不了多少,但是可以刷新排名