思路
我的想法是使用栈来保存从根节点到节点p q的路径,然后对比这两条路径可以得到最低公共父节点。
提交代码:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
Stack<TreeNode> stack1=new Stack<>();
Stack<TreeNode> stack2=new Stack<>();
findPath(root,p,stack1);
findPath(root,q,stack2);
while(stack1.size()>stack2.size())
stack1.pop();
while(stack2.size()>stack1.size())
stack2.pop();
while(stack1.peek()!=stack2.peek()) {
stack1.pop();
stack2.pop();
}
return stack1.peek();
}
public void findPath(TreeNode root,TreeNode node,Stack<TreeNode> stack) {
if(root==node) {
stack.push(root);
return;
}
if(root.left==null&&root.right==null) return;
stack.push(root);
if(root.left!=null)
findPath(root.left,node,stack);
if(stack.peek()==node) return;
if(root.right!=null)
findPath(root.right,node,stack);
if(stack.peek()!=node)
stack.pop();
}
}
运行结果
提交代码:(来自评论区)
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 ? left : right;
}
}