情况二:节点只有左、右指针,没有parent指针,root已知
思路:有两种情况,一是要找的这两个节点(a, b),在要遍历的节点(root)的两侧,那么这个节点就是这两个节点的最近公共父节点;
二是两个节点在同一侧,则 root->left 或者 root->right 为 NULL,另一边返回a或者是b。那么另一边返回的就是他们的最小公共父节点。
递归有两个出口,一是没有找到a或者b,则返回NULL;二是只要碰到a或者b,就立刻返回。
typedef struct BiTNode
{
int data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}*BiTree;
BiTree findanstorab(BiTree root,BiTree a,BiTree b)
{
if(root==a || root==b)
return root;
if(root==NULL)
return NULL;
BiTree leftChild=findanstorab(root->lchild,a,b);
BiTree rightChild=findanstorab(root->rchild,a,b);
if(leftChild&&rightChild)
return root;
return leftChild?leftChild:rightChild;
}
void CreateTree(BiTree& T)
{
T=(BiTree)malloc(sizeof(BiTNode));
scanf("%d",&T->data);
if(T->data==0)
{
T->lchild=NULL;
T->rchild=NULL;
return;
}
CreateTree(T->lchild);
CreateTree(T->rchild);
}
void PreOrderTraverse(BiTree T)
{
if(T)
{
cout<<T->data<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
int main()
{
BiTree T;
CreateTree(T);
PreOrderTraverse(T);
cout<<endl;
BiTree a=T->lchild->lchild;
BiTree b=T->lchild->rchild;
cout<<findanstorab(T,a,b)->data<<endl;
return 0;
}