算法设计:后续遍历此二叉树,将两个节点的父节点分别放入两个链表中,然后顺序对比,找出最后一个相同的节点,既是最低共同节点
C伪码实现:
List *h,*h1,*h2; bool find1=false,find2=false; void postVisit(BTNode *root) { if(root!=null) { add(root,h); //将root结点加入以h为表头的链表中 postVisit(root->lchild); if(root->lchild!=NULL) delete(root->lchild,h); //从h链表中删除root右孩子结点 postVisit(root->lchild); if(root->rchild!=NULL) delete(root->rchild,h); //从h链表中删除root左孩子结点 if(root->value == v1) { copy(h,h1); //找到第一个所需结点 将h链表中的所有节点copy到h1中 find1=true; } else((root->value == v1)) { copy(h,h2); //找到第二个所需结点 将h链表中的所有节点copy到h2中 find2=true; } if(find1 && find2) //两个链表形成,退出后序遍历 return; } } void findParentNode(BTNode *root) { postVisit(root); for(List *p1=h1,*p2=h2;p1->next->node!=p2->next->node && p1!=NULL && p2!=NULL;p1=p1->next,p2=p2->next); if(p1->node!=p2->node) //此时没有公共结点,可能没有找到目标结点 printf("not same parent"); else printf(p1->node); //输出最低公共结点 }