P162 例8-2 编写程序,建立如图8-10(b)所示的带头节点的二叉链存储结构二叉树,首先打印该二叉树,然后分别输出按照前序遍历二叉树次序、中序遍历二叉树次序和后序遍历二叉树次序访问各节点的信息,最后查找字符’E’是否在二叉树中。
头文件1:BiTree.h
#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
typedef struct Node
{
DataType data;
struct Node *leftChild;
struct Node *rightChild;
}BiTreeNode;
void Initiate(BiTreeNode **root)
{
*root = (BiTreeNode*)malloc(sizeof(BiTreeNode));
(*root)->leftChild = NULL;
(*root)->rightChild = NULL;
}
BiTreeNode *InsertLeftNode(BiTreeNode *curr,DataType x)
{
BiTreeNode *s, *t;
if(curr == NULL)
return NULL;
t = curr->leftChild;
s = (BiTreeNode*)malloc(sizeof(BiTreeNode));
s->data = x;
s->leftChild = t;
s->rightChild = NULL;
curr->leftChild = s;
return curr->leftChild;
}
BiTreeNode *InsertRightNode(BiTreeNode *curr,DataType x)
{
BiTreeNode *s, *t;
if(curr == NULL)
return NULL;
t = curr->rightChild;
s = (BiTreeNode*)malloc(sizeof(BiTreeNode));
s->data = x;
s->rightChild = t;
s->leftChild = NULL;
curr->rightChild = s;
return curr->rightChild;
}
void Destroy(BiTreeNode **root)
{
if((*root) != NULL && (*root)->leftChild != NULL)
Destroy(&(*root)->leftChild);
if((*root) != NULL && (*root)->rightChild != NULL)
Destroy(&(*root)->rightChild);
free(*root);
}
头文件2:BiTreeTraverse.h
#include"BiTree.h"
void Visit(DataType item)
{
printf("%c ",item);
}
void PrintBiTree(BiTreeNode *root, int n)
{
int i;
if(root == NULL)
return;
PrintBiTree(root->rightChild,n + 1);
for(i = 0;i < n-1 ; i++)
printf(" ");
if(n>0)
{
printf("---");
printf("%c\n",root->data);
}
PrintBiTree(root->leftChild,n + 1);
}
BiTreeNode *Search(BiTreeNode *root,DataType x)
{
BiTreeNode *find=NULL;
if(root!=NULL)
{
if(root->data==x)
find=root;
else
{
find=Search(root->leftChild,x);
if(find==NULL)
find=Search(root->rightChild,x);
}
}
return find;
}
void PreOrder(BiTreeNode *t,void Visit(DataType item))
{
if(t != NULL)
{
Visit(t->data);
PreOrder(t->leftChild, Visit);
PreOrder(t->rightChild, Visit);
}
}
void InOrder(BiTreeNode *t,void Visit(DataType item))
{
if(t != NULL)
{
InOrder(t->leftChild, Visit);
Visit(t->data);
InOrder(t->rightChild, Visit);
}
}
void PostOrder(BiTreeNode *t,void Visit(DataType item))
{
if(t != NULL)
{
PostOrder(t->leftChild, Visit);
PostOrder(t->rightChild, Visit);
Visit(t->data);
}
}
源文件:例8-2.c
#include"BiTreeTraverse.h"
int main()
{
BiTreeNode *root,*p,*find;
char x='E';
Initiate(&root);
p=InsertLeftNode(root,'A');
p=InsertLeftNode(p,'B');
p=InsertLeftNode(p,'D');
p=InsertRightNode(p,'G');
p=InsertRightNode(root->leftChild,'C');
InsertLeftNode(p,'E');
InsertRightNode(p,'F');
PrintBiTree(root,0);
printf("前序遍历:");
PreOrder(root->leftChild,Visit);
printf("\n中序遍历:");
InOrder(root->leftChild,Visit);
printf("\n后序遍历:");
PostOrder(root->leftChild,Visit);
find=Search(root,x);
if(find!=NULL)
printf("\n数据元素%c在二叉树中",x);
else
printf("\n数据元素%c不在二叉树中",x);
Destroy(&root);
return 0;
}