二叉排序树的存储结构和增删查改

在这里插入图片描述

顺序存储结构

#include <stdio.h>
//用顺序数组的形式,存储建立一个二叉搜索树
/*
1,我们根据完全二叉树的编号,我们做数组角标1存储输入的第一个元素
2,得到根元素之后,我们开始建立这样的二叉树
	若元素的值大于根节点,则将元素往根节点的右子节点移动,若此节点为空
	那么,存入,否则,直到找到这个空位置
	若元素的值小于根节点,按么则将元素往根节点的左子节点移动,直到找到
	空位存储之
注意,如何寻找节点的左右子节点呢?
用左节点为父节点×2,右子节点为父节点×2+1,
根据这个关系,找到角标,存储之。
*/
void create_btree(int b_tree[], int nodelist[], int len) {
	int i;
	int level;//树的层级,我们用这个level去推进计算将要插入的数字的角标,
	//直白的说,就是确定它的树中位置
	b_tree[1] = nodelist[1];

	for (i = 2;i < len;i++) {
		level = 1;//每一个新元素在二叉搜索树的位置都是通过根节点进行搜索
		while (b_tree[level] != 0) {//0表示当前的子树位置是空的 
			if (nodelist[i] < b_tree[level]) {
				level = level * 2;
			}
			else {
				level = level * 2 + 1;
			}
		}
		//出了循环,说明新元素在二叉搜索树中的位置就定下了
		b_tree[level] = nodelist[i];
	}

}


//若一棵树的左子树所有的值都比根节点的值小,右子树的值都比根大
//这样的二叉树,我们成为二叉查找树(Binary search tree)
int main1(void){
	int b_tree[16] = { 0 };
	int nodelist[16] = { 0, 6,3,8,
						5,2,9,4,7,
						10,0,0,0,
						0,0,0};//根据角标的定义,我们的数组形式不用0开始做编号
	create_btree(b_tree, nodelist, 16);
	for (int i = 1;i < 16;i++) {
		printf("%d,[%d] \n", i, b_tree[i]);
	}
	getchar();
	return 0;
}

链式存储结构

#include <stdio.h>
#include <stdlib.h>
typedef int datatype ;
typedef struct node {
	datatype data;
	struct node *left, *right;	
}BitTree;
//辅助队列Q,这是用来存关系的
BitTree* Q[16];//这是一个指针数组,它将缓存节点的地址,因为这个地址将以
//left域,或者right域进入二叉链表,它本身不维护i,2i,2i+1的关系
//他的关系通过front,rear来维护

//按照直观的建立,我们首先想到的是层次法
//我们根据层次,来逐一将二叉树建立
//输入的数组是按照完全二叉树的编号规则设立,即
//数组角标反映了节点位置关系(存联系)
//逐个扫描数组,直到所有的节点都存取完毕之后,就结束
//约定,0表示数组当前元素为空,最后一个节点标志是-999
BitTree* CreateBinTree(int arr[]) {
	int i = 1;
	//只要我们没有扫描完元素,那么这个二叉链表就没有完成
	//只要扫描,我们就malloc一个节点,然后把这个节点存入left域或者right域
	int front = 1, rear = 0;
	BitTree* root = NULL;
	BitTree* s;//暂存节点
	while (arr[i]!=-999) {
		s = NULL;
		if (arr[i] != 0) {//意味着这个不是空节点,那么我们就要分配空间
			s = (BitTree*)malloc(sizeof(BitTree));
			s->data = arr[i];//存数值
			s->left = NULL;
			s->right = NULL;

		}
		//要让我们新节点入队,进入缓存,等待分配双亲的left域和right域
		Q[++rear] = s;

		if (rear == 1)
		{
			root = s;
		}
		else {
			if (s != NULL && Q[front]) {
				if (rear % 2 == 0) {
					Q[front]->left = s;
				}
				else {
					Q[front]->right = s;
				}
			}
			if (rear % 2 == 1)
				front++;
		}




		i++;
	}
	return root;
}

//树遍历问题:非线性结构的输出问题:前序,中序,后序
void inorder(BitTree *t) {
	if (t) {
		inorder(t->left);
		printf("%d ", t->data);
		inorder(t->right);
	}
}

void preorder(BitTree* t) {
	if (t) {
		//根左右
		printf("%d ", t->data);
		preorder(t->left);
		preorder(t->right);
	}
}

void postorder(BitTree* t) {
	if (t) {
		//左右根
		postorder(t->left);
		postorder(t->right);
		printf("%d ", t->data);
	}
}

int main(void) {

	int arr[17] = {0,6,3,8,
					2,5,7,9,
					0,0,4,0,
					0,0,0,10,
					-999
	};
	BitTree *root = CreateBinTree(arr);
	inorder(root);
	getchar();
	return 0;
}

二叉排序树的查找

二叉排序树的插入在这里插入图片描述

在这里插入图片描述
二叉排序树的删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值