
/**
找到给定节点 p q 的最近公共祖先
后序遍历先找到目标节点,再回溯逐层向上返回。
若左右子树返回值都不为空:
则说明两目标节点在当前节点两侧;;;返回当前节点即可
若左子树与右子树其中一个为空:
则说明另一个节点未找到或都在left的子树中;;;返回left即可,反之返回right
若当前节点为目标节点之一:(已包含在终止条件中)
则说明另一个节点在别的方向或当前目标节点为另一个目标节点的父节 点直接返回即可
*/
/**
* 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) {
/**
找到给定节点 p q 的最近公共祖先
后序遍历先找到目标节点,再回溯逐层向上返回。
若左右子树返回值都不为空:
则说明两目标节点在当前节点两侧;;;返回当前节点即可
若左子树与右子树其中一个为空:
则说明另一个节点未找到或都在left的子树中;;;返回left即可,反之返回right
若当前节点为目标节点之一:(已包含在终止条件中)
则说明另一个节点在别的方向或当前目标节点为另一个目标节点的父节点,直接返回即可
*/
return getLCA(root,p,q);
}
private TreeNode getLCA(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || root == p || root == q) { //root不为null;说明另一个节点在别的方向或当前目标节点为另一个目标节点的父节点,直接返回即可
return root;
}
//后序遍历
TreeNode left = getLCA(root.left, p, q);
TreeNode right = getLCA(root.right, p, q);
//回溯 判断
if(left != null && right != null) { //说明两目标节点在当前节点两侧; 返回当前节点即可
return root;
}
if(left != null && right == null) { //说明另一个节点未找到或都在left的子树中;;;返回left即可,反之返回right
return left;
} else {
return right;
}
}
}
965

被折叠的 条评论
为什么被折叠?



