给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

解题思路:先分别记录根节点到两个结点的路径,再求出两个路径中最后一个相同的结点即为最近公共祖先.

实现代码


/** * 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: void path_search(TreeNode *node, int &flag, vector<TreeNode* >&path, vector<TreeNode* > &result, int target) { if(!node || flag) return ; path.push_back(node); if(node->val == target) { flag = 1; result = path; } path_search(node->left, flag, path, result,target); path_search(node->right, flag, path, result, target); path.pop_back(); } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { vector<TreeNode* > path; vector<TreeNode* > path_p; vector<TreeNode* > path_q; int flag = 0; path_search(root, flag, path, path_p, p->val); flag = 0; path.clear(); path_search(root, flag, path, path_q, q->val); int path_length = min(path_p.size(), path_q.size()); TreeNode* result; for(int i = 0; i < path_length; i++) { if(path_p[i] == path_q[i]) result = path_p[i]; } return result; }};