题目链接
题意
求二叉树里两个节点的最近公共祖先
思路
递归求解。
如果当前节点为空,说明已经遍历到了叶子节点的下个节点,返回空。
如果当前节点等于p或q,说明当前节点就是最近公共祖先,返回root;
否则,递归求当前节点的左子树、右子树里,两者的最近公共祖先。
如果左子树的lca为空,说明两者都在右子树里,则lca为右子树的lca返回值。
否则,如果右子树的lca为空,说明两者都在左子树里,则lca为左子树的lca返回值;否则,说明两者分列root两侧,root就是lca。
代码
/** * 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) return root; if(root==p||root==q) return root; TreeNode* l=lowestCommonAncestor(root->left,p,q); TreeNode* r=lowestCommonAncestor(root->right,p,q); if(!l){ return r;///两者都在右子树 } else{ if(!r) return l;///两者都在左子树 return root;///分列两边 } } };