二叉树的最近公共祖先
链接
解题思路:
首先呢我们先选择该如何遍历,按照题目要求可以知道,如果要知道两个叶子节点的根节点,那最好就是使用后序遍历,左右中的顺序。
left()
right()
code.......
那分析遍历左右节点后,我们该干嘛。
当我们遍历两边之后,如果left为空,证明right有我们需要的节点,反之也成立。
当两边都不为空,证明root为祖先。
那不理解的地方可能是,两个节点在一条路径上,怎么返回祖先呢?
因为当碰到第一个节点的时候就返回了,所以不用考虑再往下遍历,返回的节点就是祖先节点。
代码如下
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {TreeNode} p
* @param {TreeNode} q
* @return {TreeNode}
*/
var lowestCommonAncestor = function(root, p, q) {
// 确定返回值和参数
const cur =(root,p,q)=>{
// 确定终止条件
if(root===p||root===q||root===null) return root
// 确定单层逻辑,后序遍历
let left = cur(root.left,p,q)
let right = cur(root.right,p,q)
if(left!==null&&right!==null) {
return root
}
else if(left===null){
return right
}
else if(right===null){
return left
}
}
return cur(root,p,q)
};