//二叉树的创建、遍历以及求结点p的前驱、后继结点
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree CreateBTree(BiTree T, bool isRoot){//创建一个二叉树 #代表空节点
char ch;
if (isRoot)
printf("Root: ");
fflush(stdin);
scanf("%c", &ch);
fflush(stdin);
if (ch != '#'){
isRoot = false;
T = new BiTNode;
T->data = ch;
T->lchild = NULL;
T->rchild = NULL;
printf("%c's left child is: ", T->data);
T->lchild = CreateBTree(T->lchild, isRoot);
printf("%c's right child is: ", T->data);
T->rchild = CreateBTree(T->rchild, isRoot);
}
return T;
}
void visit1(BiTree T){ //输出结点值
printf("%c ",T->data);
}
void PreOrder(BiTree T){ //先序遍历
if(T!=NULL){
visit1(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T){//中序遍历
if(T!=NULL){
PreOrder(T->lchild);
visit1(T);
PreOrder(T->rchild);
}
}
void PostOrder(BiTree T){//后序遍历
if(T!=NULL){
PreOrder(T->lchild);
PreOrder(T->rchild);
visit1(T);
}
}
/* 关于队列的相关操作见https://blog.csdn.net/qq_40280704/article/details/106802197
void LevelOrder(BiTree T){//层次遍历
InitQueue(Q); //辅助队列
BiTree p;
EnQueue(Q,T);
while(!IsEmpty(Q)){
DeQueue(Q,p);
visit1(p);
if(p->lchild!= NULL){
EnQueue(Q,p->lchild);
}
if(p->rchild!=NUll){
EnQueue(Q,p->rchild);
}
}
}
*/
/*
BiTNode *p;//p指向目标节点
BiTNode *pre = NULL;//pre指向访问结点的前驱结点
BiTNode *final = NULL;//用于记录最终结果
//中序遍历访问p结点的前驱结点final: (若访问p的后继结点,则pre == p时,final=q
void visit2(BiTNode *q){
if(p==q){
final=pre;
}
else{
pre=q;
}
}
void PreInOrder(BiTree T){
if(T!=NULL){
PreInOrder(T->lchild);
visit2(T);
PreInOrder(T->rchild);
}
}
*/
int main(){
BiTree T ;
T = CreateBTree (T,true);
printf("中序遍历结果为:");
InOrder(T);
return 0;
}