二叉排序树

1.头文件


typedef struct BinTree* BTree;
typedef int ElemData;

//二叉有序数左子树的值小于根节点与右子数 
typedef struct BinTree{
	BTree left;
	BTree right;
	BTree parent;
	ElemData data;
}BinTree;

//初始化只有ROOT节点的树 
void initTree(BTree* bTree,ElemData e); 

//创建一个树节点 
BTree createNode();

BTree findNode(BTree bTree,ElemData e);

//插入一个树节点
void insertNodeToTree(BTree* bTree,ElemData e);

//遍历 (中序遍历 左根右)
void ergodicTree_LDR(BTree bTree);

//遍历 (先序遍历 根左右)
void ergodicTree_DLR(BTree bTree);

//遍历 (后序遍历 左右根)
void ergodicTree_LRD(BTree bTree);

void destroyTree(BTree bTree);

2.实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tree.h"
#include <time.h>

//创建一个树节点 
BTree createNode(){
	BTree bTree = (BTree)malloc(sizeof(BinTree));
	if(bTree == NULL){
		printf("内存分配失败!\n");
		return NULL;
	}
	memset(bTree,0,sizeof(BinTree));
	bTree->left = NULL;
	bTree->right = NULL;
	bTree->parent = NULL;
	return bTree;
}

//初始化只有ROOT节点的树 
void initTree(BTree* bTree,ElemData e){
	BTree bt = createNode();
	if(bt == NULL)
		return;
	bt->data = e;
	*bTree = bt;
}

//插入一个树节点
void insertNodeToTree(BTree* bTree,ElemData e){
	BTree tree = NULL;
	if(*bTree != NULL){
		tree = findNode(*bTree,e);
		if(tree == NULL){
			return;
		}
	}
	
	if(tree != NULL && tree->data == e){
		return;
	}
	
	BTree bt = createNode();
	if(bt == NULL)
		return;
	bt->data = e;
	if(*bTree == NULL){
		*bTree = bt;
		return;	
	}

	//插入到左子树节点 
	if(tree->data > e && tree->left == NULL){
		tree->left = bt;
		bt->parent = tree;
	}
	//插入到右子树 
	else if(tree->data < e && tree->right == NULL){
		tree->right = bt;
		bt->parent = tree;
	}
}

//要插入的位置为一个左子数节点为NULL或者右子树为NULL的地方,所以只需要遍历改二叉树,找到一个为左右子树为空的合适的节点就可以插入 
BTree findNode(BTree bTree,ElemData e){
	if(bTree == NULL){
		return NULL;
	}
	if(bTree->data > e && bTree->left != NULL){
		findNode(bTree->left,e);
	}else if( bTree->data < e && bTree->right != NULL){
		findNode(bTree->right,e);
	}else{
		return bTree; 
	}
	
}


//遍历 (中序遍历 左根右)
void ergodicTree_LDR(BTree bTree){
	if(bTree == NULL)
		return;
	ergodicTree_LDR(bTree->left);
	printf("%d-->",bTree->data);
	ergodicTree_LDR(bTree->right);
}

//遍历 (先序遍历 根左右)
void ergodicTree_DLR(BTree bTree){
	if(bTree == NULL)
		return;
	printf("%d-->",bTree->data);	
	ergodicTree_DLR(bTree->left);
	ergodicTree_DLR(bTree->right);
}

//遍历 (后序遍历 左右根)
void ergodicTree_LRD(BTree bTree){
	if(bTree == NULL)
		return;
	ergodicTree_LDR(bTree->left);
	ergodicTree_LDR(bTree->right);
	printf("%d-->",bTree->data);
}

void destroyTree(BTree bTree);

int main(){
	BTree bTree = NULL;
	initTree(&bTree,50);
	
	insertNodeToTree(&bTree,100);
	insertNodeToTree(&bTree,30);
	insertNodeToTree(&bTree,20);
	insertNodeToTree(&bTree,31);
	insertNodeToTree(&bTree,20);
	srand((unsigned) time(NULL)); 
//	for (int i=0; i<100; i++)
//	{	
//		int number = rand() % 10; //产生0-100的随机数
//		insertNodeToTree(&bTree,number);
//	} 
	ergodicTree_LDR(bTree);
	printf("\n");
	return 0;
}

 

转载于:https://my.oschina.net/meshwon/blog/890160

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值