数据结构(二叉排序树)

二叉排序树:根节点的值一定大于左子树的值,一定小于右子树的值。

二叉排序树的建立,添加,删除,查找

#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<malloc.h>
#include<queue>
#include<vector>
using namespace std;

typedef struct node{
	int data;
	struct node* lchild;
	struct node* rchild;
}node;

int search(node* p, int key)
{
	if(p == NULL)
		return 0;
	else
	{
		if(p->data == key)
			return 1;
		else if(key < p->data)
			return search(p->lchild, key);
		else 
			return search(p->rchild, key);
	 } 
}

int insert(node* &p, int key)
{
	if(p == NULL)
	{
		p = (node*)malloc(sizeof(node));
		p->lchild = p->rchild = NULL;
		p->data = key;
		return 1;
	}
	else
	{
		if(key == p->data)
			return 0;
		else if(key < p->data)
			insert(p->lchild, key);
		else
			insert(p->rchild, key);
	}
}

void create(node* &p, int key[], int n)
{
	p = NULL;
	for(int i = 0; i < n; i++)
		insert(p, key[i]);
}

/*
	关键字即 数值 
	1.p为叶子节点,直接删除即可。
	2.p只有一个孩子,将该孩子指向自己的父节点
	3.p有两个孩子 
		1.沿着p的左孩子一直向右走 ,走到该节点(r)没有右孩子为止(p点根节点的左子树最大关键字),
		用r的关键字代替 p中的关键字,之后删除r节点
		2. 沿着p的右孩子一直向左走 ,走到该节点(r)没有左孩子为止(p点根节点的右子树最小关键字),
		用r的关键字代替 p中的关键字,之后删除r节点
*/
void det(node* &p)
{
    node* q;
	node* s;
    if(p->rchild == NULL)//只是右子树非空则只需重接它的左子树
    {
        q = p; 
		p = p->lchild;
		free(q);
    }
    else if(p->lchild == NULL)//只是左子树非空只需重接它的右子树
    {
        q = p; 
		p = p->rchild;
		free(q);
    }
    else//左右子树均不空
	{
        q = p;
        s = p->lchild;
        while(s->rchild != NULL)//转左,然后向右走到尽头
		{
			q = s;
			s = s->rchild;
		}
        p->data = s->data; //相当于r的关键字代换p的 
        if(q != p)
			q->rchild = s->lchild;//重接*q右子树
        else 
			q->lchild = s->lchild;//重接*q左子树
        free(s);
    }
}


int del(node* &p, int key)
{
	if(p == NULL)
		return 0;
	else
	{
		if(key == p->data)
		{
			det(p);
			return 1;
		}
		else if(key < p->data)
			del(p->lchild, key);
		else
			del(p->rchild, key);
	}
}


int main()
{
	int a[15];
	for(int i = 0; i < 10; i++)
		a[i] = i;
	node* root;
	root = (node*)malloc(sizeof(node));
	create(root, a, 10); 
	printf("查找结果:%d\n", search(root, 5));
	printf("添加结果:%d\n", insert(root, 11));
	printf("删除结果:%d\n", del(root, 10));
	printf("删除结果:%d\n", del(root, 5));
	return 0;
	 
} 
查找结果:
[Cházhǎo jiéguǒ:]
Find results:
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉排序树,也称为二叉搜索树(Binary Search Tree,简称BST),是一种特殊的二叉树结构,它具有以下性质: 1. 对于二叉排序树的任意一个非叶子节点,其左子树的所有节点的值都小于该节点的值,右子树的所有节点的值都大于该节点的值。 2. 对于二叉排序树的任意一个节点,其左子树和右子树都是二叉排序树。 下面是一个示例代码,演示了如何构建一个二叉排序树,并进行插入和查找操作: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def insert(root, val): if root is None: return TreeNode(val) if val < root.val: root.left = insert(root.left, val) else: root.right = insert(root.right, val) return root def search(root, val): if root is None or root.val == val: return root if val < root.val: return search(root.left, val) else: return search(root.right, val) # 构建二叉排序树 root = None values = [5, 3, 8, 2, 4, 7, 9] for val in values: root = insert(root, val) # 查找节点 target = 4 result = search(root, target) if result: print("找到了节点", target) else: print("未找到节点", target) ``` 这段代码首先定义了一个`TreeNode`类,表示二叉排序树的节点。然后定义了`insert`函数,用于向二叉排序树中插入节点。最后定义了`search`函数,用于在二叉排序树中查找指定的节点。通过构建二叉排序树并进行查找操作,可以实现对数据的快速插入和查找。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值