数据结构(二叉排序树)

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

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

#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:
 

猜你喜欢

转载自blog.csdn.net/qq_38295645/article/details/90109957