P162 例8-2 编写程序,建立如图8-10(b)所示的带头节点的二叉链存储结构二叉树,首先打印该二叉树,然后分别输出按照前序遍历二叉树次序、中序遍历二叉树次序和后序遍历二叉树次序访问各节点的信息,

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值