剑指 Offer 68 - II. 二叉树的最近公共祖先
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(!root || root == p || root == q) return root; TreeNode* L = lowestCommonAncestor(root->left, p, q); TreeNode* R = lowestCommonAncestor(root->right, p, q); if(!L && !R) return nullptr; if(L && R) return root; if(L) return L; return R; } };
首先考虑递归边界,当根节点为空指针,返回空指针;
若p,q中的一个是根节点,那么p, q的LCA就是根节点。
也就是说,如果当前子树中,但凡有p, q中的一个,就不会返回nullptr
遍历根节点的左右子树,如果返回值L,R都是nullptr,说明p,q既不在当前结点的左子树,也不在当前节点的右子树
如果L,R都不为空,说明p,q一个在左子树,一个在右子树,所以他们的LCA就是当前的根节点
在此基础上,如果L,R并非都是非空,而L是非空,说明p,q都在左子树,则返回L,以L为根节点继续递归,也就是遍历左子树。
同理,如果p,q都在右子树,递归遍历右子树。
浙公网安备 33010602011771号