链式存储的二叉树

课本上的东西,放到这里是查阅方便。 

#include <stdio.h>
#include <malloc.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);
	}
   //左删除子树 
   BiTreeNode *DeleteLeftTree(BiTreeNode *curr)
   {
   	if(curr==NULL||curr->leftChild==NULL) return NULL;
   	Destroy(&curr->leftChild);
   	curr->leftChild = NULL;
   	return curr;
   }
   //右删除子树 
   BiTreeNode *DeleteRightTree(BiTreeNode *curr)
   {
   	if(curr==NULL||curr->rightChild==NULL) return NULL;
   	Destroy(&curr->rightChild);
   	curr->rightChild = NULL;
   	return curr;
   }
   //前序遍历
   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)
	{
		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;
	 } 

 测试:

#include <stdio.h>
#include "head.h"

void Visit(DataType item)
{
	printf("%c ", item);
}

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;
 } 

示意图如下

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值