//聽创建二叉树,输入先序扩展序列:
//聽ABC##DE#G##F###
//聽先序遍历序列:聽A聽B聽C聽D聽E聽G聽F
//聽中序遍历序列:聽C聽B聽E聽G聽D聽F聽A
//聽后序遍历序列:聽C聽G聽E聽F聽D聽B聽A
//聽先序遍历(显示双亲):
//聽A(NUL)聽B(NUL)聽C(NUL)聽D(NUL)聽E(NUL)聽G(NUL)聽F(NUL)
//
//聽增加双亲后,先序遍历(显示双亲):
//聽A(NUL)聽B(A)聽C(B)聽D(B)聽E(D)聽G(E)聽F(D)
//
//聽聽聽聽聽聽聽聽A
//聽聽聽聽聽聽聽/
//聽聽聽聽聽聽B
//聽聽聽聽聽/聽聽\
//聽聽聽聽C聽聽聽聽D
//聽聽聽聽聽聽聽聽/聽聽\
//聽聽聽聽聽聽聽E聽聽聽聽F
//聽聽聽聽聽聽聽聽\
//聽聽聽聽聽聽聽聽聽G
//
#include
#include
typedef聽struct聽Node聽聽//二叉树的"三叉链表"存储结构
{
聽聽聽聽char聽data;
聽聽聽聽struct聽Node聽*lchild;聽//左孩子指针
聽聽聽聽struct聽Node聽*rchild;聽//右孩子指针
聽聽聽聽struct聽Node聽*parent;聽//双亲指针
}Bitree;
//用聽先序扩展序列+递归聽创建二叉树
void聽CreateBiTree(Bitree聽**bt)
{
聽聽聽聽char聽ch;
聽聽聽聽scanf("%c",&ch);聽//输入数据
聽聽聽聽if(ch=='#')聽聽聽聽聽聽//'#'是空节点
聽聽聽聽{
聽聽聽聽聽聽聽*bt=NULL;
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽聽聽聽*bt=(Bitree聽*)malloc(sizeof(Bitree));
聽聽聽聽聽聽聽聽(*bt)->data=ch;
聽聽聽聽聽聽聽聽(*bt)->parent=NULL;聽//用于测试
聽聽聽聽聽聽聽聽CreateBiTree(&((*bt)->lchild));
聽聽聽聽聽聽聽聽CreateBiTree(&((*bt)->rchild));
聽聽聽聽}
}
//增加双亲指针(用先序遍历,递归法)
void聽createParent(Bitree聽*ptr,Bitree聽*parent)
{
聽聽聽聽if(ptr!=NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽ptr->parent聽=聽parent;
聽聽聽聽聽聽聽聽createParent(ptr->lchild,ptr);
聽聽聽聽聽聽聽聽createParent(ptr->rchild,ptr);
聽聽聽聽}
}
void聽preOrderWithParent(Bitree聽*ptr)聽//先序遍历(显示双亲)
{
聽聽聽聽if(ptr!=NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽if(ptr->parent聽==聽NULL)
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽printf("%c(NUL)聽",ptr->data);
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽else
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽printf("%c(%c)聽",ptr->data,ptr->parent->data);
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽preOrderWithParent(ptr->lchild);
聽聽聽聽聽聽聽聽preOrderWithParent(ptr->rchild);
聽聽聽聽}
}
void聽preOrder(Bitree聽*ptr)聽//先序遍历
{
聽聽聽聽if(ptr!=NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽printf("%c聽",ptr->data);
聽聽聽聽聽聽聽聽preOrder(ptr->lchild);
聽聽聽聽聽聽聽聽preOrder(ptr->rchild);
聽聽聽聽}
}
void聽inOrder(Bitree聽*ptr)聽//中序遍历
{
聽聽聽聽if(ptr!=NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽inOrder(ptr->lchild);
聽聽聽聽聽聽聽聽printf("%c聽",ptr->data);
聽聽聽聽聽聽聽聽inOrder(ptr->rchild);
聽聽聽聽}
}
void聽postOrder(Bitree聽*ptr)聽//后序遍历
{
聽聽聽聽if(ptr!=NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽postOrder(ptr->lchild);
聽聽聽聽聽聽聽聽postOrder(ptr->rchild);
聽聽聽聽聽聽聽聽printf("%c聽",ptr->data);
聽聽聽聽}
}
int聽main()
{
聽聽聽聽Bitree聽*root;
聽聽聽聽//创建二叉树,输入先序扩展序列
聽聽聽聽CreateBiTree(&root);
聽聽聽聽printf("先序遍历序列:聽");
聽聽聽聽preOrder(root);
聽聽聽聽printf("\n中序遍历序列:聽");
聽聽聽聽inOrder(root);
聽聽聽聽printf("\n后序遍历序列:聽");
聽聽聽聽postOrder(root);
聽聽聽聽printf("\n先序遍历(显示双亲):聽");
聽聽聽聽preOrderWithParent(root);
聽聽聽聽createParent(root,NULL);
聽聽聽聽printf("\n\n增加双亲后,先序遍历(显示双亲):聽");
聽聽聽聽preOrderWithParent(root);
聽聽聽聽printf("\n");
聽聽聽聽return聽0;
} |