//找到二叉链表 中结点p的中序前驱结点
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BiTreeNode{
ElemType data;
struct BiTreeNode *lchild,*rchild;
}BiTreeNode ,*BiTree;
void InitBiTreeNode(BiTreeNode* &root){
root=NULL;
}
//构建二叉树
void CreateBiTree(BiTreeNode* &root){
ElemType value;
value=getchar();
if(value=='#') root=NULL;
else{
root=(BiTreeNode*)malloc(sizeof(BiTreeNode));
if(root==NULL){
printf("内存分配Failure!\n");
exit(1);
}
root->data=value;
CreateBiTree(root->lchild);
CreateBiTree(root->rchild);
}
}
void InOrder(BiTreeNode* T){
if(T!=NULL){
InOrder(T->lchild);
printf("%c ",T->data);
InOrder(T->rchild);
}
}
void Visit(BiTreeNode* q,ElemType p,BiTreeNode* &pre,BiTreeNode* &final){
if(q->data==p) final=pre;//当前访问结点值刚好是p,找到p的前驱
else pre=q;//pre指向当前访问的结点
}
bool FindInOrderPreNode(BiTreeNode* root,ElemType p,BiTreeNode* &pre,BiTreeNode* &final){
//找结点p中序遍历的前驱结点
if(root!=NULL){
FindInOrderPreNode(root->lchild,p,pre,final);
Visit(root,p,pre,final);
if(final!=NULL)
return true;
FindInOrderPreNode(root->rchild,p,pre,final);
}
return false;
}
int main(){
BiTreeNode* T,* pre=NULL,* final=NULL;
InitBiTreeNode(T);
printf("请输入('#'表示空子树):\n");
CreateBiTree(T);
InOrder(T);
ElemType p='C';
FindInOrderPreNode(T,p,pre,final);
printf("\n请问结点%c中序遍历的前驱结点是:%c\n",p,final->data);
return 0;
}