三种情况:
二叉树每个节点都有parent即三叉链
搜索二叉树
普通的二叉树
第一种情况:
如果是一个三叉链,每一个节点都有一个parent,我们可以把它当成求两个链表的第一个公共节点。两个链表的开始分别是这两个节点,链表指向下一个节点的指针就是二叉树中指向父子节点的parent,而这两个链表的第一个公共节点就是二叉树中要找的两个节点的最低公共祖先。
第二种情况
作为一个搜索二叉树,最重要的特点就是左子树的所有节点的值都小于右子树的所有节点。那我们就可以从根节点出发,该节点比这两节点都小,就往它的右子树走,如果比两个节点都大,就往它的左子树走。直到出现第一个比一个节点大比一个节点小的节点,此时这个节点就是就是这两个节点的最低公共祖先。
第三种情况
那就是一个普通的二叉树,我们先把这两个节点从根节点的路径求出来,保存在vector中。然后求出这两个存有路径的顺序表从尾开始的第一个相同节点,该节点就是最近公共祖先
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
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.
*/
bool GetPath(TreeNode* root,TreeNode* node,vector<TreeNode*>& v)
{
if(root==NULL||node==NULL)
{
return false;
}
v.push_back(root);
if(root==node)
{
return true;
}
if(root->left!=NULL&&GetPath(root->left,node,v))
{
return true;
}
if(root->right!=NULL&&GetPath(root->right,node,v))
{
return true;
}
v.pop_back();
return false;
}
TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *A, TreeNode *B) {
// write your code here
vector<TreeNode*> v1;
vector<TreeNode*> v2;
if(GetPath(root,A,v1)==false)
{
return NULL;
}
if(GetPath(root,B,v2)==false)
{
return NULL;
}
int i=0;
int j=0;
for(i=v1.size()-1;i>=0;i--)
{
for(j=v2.size()-1;j>=0;j--)
{
if(v1[i]->val==v2[j]->val)
{
return v1[i];
}
}
}
}
};