/* * @lc app=leetcode id=236 lang=javascript * * [236] Lowest Common Ancestor of a Binary Tree * * https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/ * * algorithms * Medium (35.63%) * Total Accepted: 267.3K * Total Submissions: 729.2K * Testcase Example: '[3,5,1,6,2,0,8,null,null,7,4]\n5\n1' * * Given a binary tree, find the lowest common ancestor (LCA) of two given * nodes in the tree. * * According to the definition of LCA on Wikipedia: “The lowest common ancestor * is defined between two nodes p and q as the lowest node in T that has both p * and q as descendants (where we allow a node to be a descendant of itself).” * * Given the following binary tree:  root = [3,5,1,6,2,0,8,null,null,7,4] * * * * Example 1: * * * Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 * Output: 3 * Explanation: The LCA of nodes 5 and 1 is 3. * * * Example 2: * * * Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 * Output: 5 * Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant * of itself according to the LCA definition. * * * * * Note: * * * All of the nodes' values will be unique. * p and q are different and both values will exist in the binary tree. * * */ /** * 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) { if (!root || root === p || root === q) return root; const left = lowestCommonAncestor(root.left, p, q); const right = lowestCommonAncestor(root.right, p, q); if (!left) return right; // 左子树找不到,返回右子树 if (!right) return left; // 右子树找不到,返回左子树 return root; // 左右子树分别有一个,则返回root };