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

    1. left()
    2. right()
    3. code.......

    那分析遍历左右节点后,我们该干嘛。
    当我们遍历两边之后,如果left为空,证明right有我们需要的节点,反之也成立。
    当两边都不为空,证明root为祖先。
    那不理解的地方可能是,两个节点在一条路径上,怎么返回祖先呢?
    因为当碰到第一个节点的时候就返回了,所以不用考虑再往下遍历,返回的节点就是祖先节点。
    代码如下

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val) {
    4. * this.val = val;
    5. * this.left = this.right = null;
    6. * }
    7. */
    8. /**
    9. * @param {TreeNode} root
    10. * @param {TreeNode} p
    11. * @param {TreeNode} q
    12. * @return {TreeNode}
    13. */
    14. var lowestCommonAncestor = function(root, p, q) {
    15. // 确定返回值和参数
    16. const cur =(root,p,q)=>{
    17. // 确定终止条件
    18. if(root===p||root===q||root===null) return root
    19. // 确定单层逻辑,后序遍历
    20. let left = cur(root.left,p,q)
    21. let right = cur(root.right,p,q)
    22. if(left!==null&&right!==null) {
    23. return root
    24. }
    25. else if(left===null){
    26. return right
    27. }
    28. else if(right===null){
    29. return left
    30. }
    31. }
    32. return cur(root,p,q)
    33. };