排序二叉树

本文深入探讨了排序二叉树的概念,包括其性质、插入与删除操作,并通过实例展示了如何利用排序二叉树进行高效的数据排序。此外,还讨论了排序二叉树在实际问题中的应用场景和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* bst.h */
#ifndef BST_H
#define BST_H

typedef struct node *link;

struct node {
	unsigned char item;
	link l, r;
};

link search(link t, int key);
link insert(link t, int key);
link delete(link t, int key);
void print_tree(link t);
#endif

#################################################

// bst.c
#include<stdlib.h>
#include<stdio.h>
#include"bst.h"

static link make_node(unsigned char item){
	link p = malloc(sizeof *p);
	p->item = item;
	p->l = p->r = NULL;
	return p;
}

static void free_node(link p){
	free(p);
}

link search(link t, int key){
	if (!t)
		return NULL;
	if (t->item > key)
		return search(t->l, key); // 没找到,继续查找,层层返回
	if (t->item < key)
		return search(t->r, key); // 没找到,继续查找,层层返回
	return t; // 找到,并返回需要的指针
}

link insert(link t, int key){  // insert返回输入的指针
	if (!t) // 找到
		return make_node(key); // 插入并返回新节点的指针
	if (t->item > key)
		t->l = insert(t->l, key); // 没找的的情况下,insert返回输入的指针,不插入的地方指向不变
	else
		t->r = insert(t->r, key); // 没找的的情况下,insert返回输入的指针,不插入的地方指向不变
	return t; // 没找的的情况下,insert返回输入的指针,不插入的地方指向不变
}

link delete(link t, int key){
	link p;
	if (!t)
		return NULL;
	if (t->item > key) 
		t->l = delete(t->l, key);
	else if (t->item < key) 
		t->r = delete(t->r, key);
	else { 
		if (t->l == NULL && t->r == NULL) { //删除节点为叶子节点
		free_node(t);
		t = NULL;
		} 
		else if (t->l) {  // 待删除的节点有左子树
			for (p=t->l; p->r; p=p->r);
			t->item = p->item; 
			t->l = delete(t->l, t->item);
		} 
		else if (t->r) { // 待删除的节点有右子树
			for (p=t->r; p->l; p=p->l);
			t->item = p->item;
			t->r = delete(t->r, t->item);
		}
	}
	return t;
}

void print_tree(link t){
	if (t) {
		printf("(");
		printf("%d", t->item);
		print_tree(t->l);
		print_tree(t->r);
		printf(")");
	} 
	else
		printf("()");
}

#################################################

// main.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "bst.h"
#define RANGE 100
#define N 6

void print_item(link p){
	printf("%d", p->item);
}

int main(){
	int i, key;
	link root = NULL;
	srand(time(NULL));
	for (i = 0; i < N; i++)
		root = insert(root, rand() % RANGE);
	printf("\t\\tree");
	print_tree(root);
	printf("\n\n");
	while (root) {
		key = rand() % RANGE;
		if (search(root, key)) {
			printf("delete %d in tree\n", key);
			root = delete(root, key);
			printf("\t\\tree");
			print_tree(root);
			printf("\n\n");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值