问题描述
笔记
先分别找到两个节点的路径,然后对比两条路径。
代码
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
private:
vector<TreeNode*> pathA;
vector<TreeNode*> pathB;
vector<vector<TreeNode*> > pathArr;
public:
/**
* @param root: The root of the binary search tree.
* @param A and B: two nodes in a Binary.
* @return: Return the least common ancestor(LCA) of the two nodes.
*/
TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *A, TreeNode *B) {
// write your code here
pathA.clear();
pathB.clear();
pathArr.clear();
int findA = 0;
int findB = 0;
getPath(root, A, pathA, pathArr);
getPath(root, B, pathB, pathArr);
TreeNode *res = NULL;
if (pathArr[0].empty() || pathArr[1].empty())
{
return res;
}
else
{
int i = 0;
int lenA = pathArr[0].size();
int lenB = pathArr[1].size();
// cout << "lena lenb "<< lenA << " " << lenB << " ";
while (i < lenA && i < lenB && pathArr[0][i] == pathArr[1][i])
{
i++;
}
return pathArr[0][i-1];
}
}
void getPath(TreeNode *root, TreeNode *A, vector<TreeNode*> &path, vector<vector<TreeNode*> > &res)
{
if (root == NULL)
{
// printf("\nfindA=%d\n", findA);
return;
}
path.push_back(root);
if (root == A)
{
res.push_back(path);
}
if (root->left)
getPath(root->left, A, path, pathArr);
if (root->right)
getPath(root->right, A, path, pathArr);
path.pop_back();
}
};