二叉树的最近公共祖先
链接
解题思路:
首先呢我们先选择该如何遍历,按照题目要求可以知道,如果要知道两个叶子节点的根节点,那最好就是使用后序遍历,左右中的顺序。
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)};
