直接上代码把:
//查找二叉树结点的公共父节点
//递归方法求解
BiTree* LowestCommonAncestorInBinaryTree (BiTree *Root,char p,char q){ //真实传参应为(BiTree *Root,BiTree p,BiTree q)
//这里只是为了测试
if(!Root)
return NULL;
//if(Root==p||Root==q) //真实代码
// return Root;
if(Root->data==p||Root->data==q) //若子身结点是p,或者q。返回自身结点
return Root;
BiTree *left=LowestCommonAncestorInBinaryTree (Root->lchild,p,q); //在树的左方进行查找
BiTree *right=LowestCommonAncestorInBinaryTree (Root->rchild,p,q); //在树的右面就行查找
if(left!=NULL&&right!=NULL) //这里可以想象图中的B结点 从B的左面找到了 D所以left不空 从B的右面找到了M所以 right不空
return Root; //将B结点向上返回
if(left==NULL&&right==NULL) //上一层B返回后有 还会去A的右侧进行查找,看图可以知道A的右侧返回为NULl
return NULL;
return left==NULL? right:left; //此时递归来到了最后一层代码因为 A的left不为空 所以最后的left 就是结果
}