数据结构学习之二叉树

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef char DataType;

typedef struct Node
{
	DataType data;
	struct Node *leftChild;
	struct Node *rightChild;
}BiTreeNode;

void Init(BiTreeNode **root)
{
	*root=(BiTreeNode *)malloc(sizeof(BiTreeNode));
	(*root)->leftChild=NULL;
	(*root)->rightChild=NULL;
}

BiTreeNode *InsertLeftNode(BiTreeNode *curr,DataType x)//若当前结点curr非空,则在curr的左子树插入元素值为x的新结点,原curr所指结点的左子树成为新插入结点的左子树,若插入成功,则返回新插入结点的指针,否则返回空指针
{
	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)//若当前结点curr非空,则在curr的右子树插入元素值为x的新结点,原curr所指结点的右子树成为新插入结点的右子树,若插入成功,则返回新插入结点的指针,否则返回空指针
{
	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);
}
BiTreeNode *DeleteLeftChild(BiTreeNode *curr)//若curr为空,则删除curr所指结点的左子树,若删除成功,则返回删除结点的双亲结点指针,否则返回空指针
{
	if(curr==NULL||curr->leftChild==NULL)return NULL;
	Destroy(&curr->leftChild);
	curr->leftChild=NULL;
	return curr;
}

BiTreeNode *DeleteRightChild(BiTreeNode *curr)//若curr为空,则删除curr所指结点的右子树,若删除成功,则返回删除结点的双亲结点指针,否则返回空指针
{
	if(curr==NULL||curr->rightChild==NULL)return NULL;
	Destroy(&curr->rightChild);
	curr->rightChild=NULL;
	return curr;
}
void Visit(DataType item)
{
	printf("%c ",item);
}

void PreOrder(BiTreeNode *root,void visit(DataType item))//前序遍历二叉树
{
	if(root!=NULL)
	{
		visit(root->data);
		PreOrder(root->leftChild,visit);
		PreOrder(root->rightChild,visit);
	}
}
void InOrder(BiTreeNode *root,void visit(DataType item))//中序遍历二叉树
{
	if(root!=NULL)
	{
		
		InOrder(root->leftChild,visit);
		visit(root->data);
		InOrder(root->rightChild,visit);
	}
}
void PostOrder(BiTreeNode *root,void visit(DataType item))//后序遍历二叉树
{
	if(root!=NULL)
	{
		
		PostOrder(root->leftChild,visit);
		PostOrder(root->rightChild,visit);
		visit(root->data);
	}
}
void PrintBiTree(BiTreeNode *root,int n)//逆时针旋转90度打印二叉树,n为缩进层次,初始值为0
{
	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;
}
int main()
{
	BiTreeNode *root,*p,*find;
	char x='E';
	Init(&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("中序遍历:");
	InOrder(root->leftChild,Visit);
	printf("后序遍历:");
	PostOrder(root->leftChild,Visit);
	find=Search(root,x);
	if(find!=NULL)
		printf("\n数据元素%c在二叉树中\n",x);
	else
		printf("\n数据元素%c不在二叉树中\n",x);
	Destroy(&root);

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值