二叉查找树的C++实现

1.基本概念:二叉查找树是一种有序排列的二叉树,在二叉查找树中,每个节点的左子树的所有元素的值小于该节点的元素的值,而右子树的每个节点的值都大于该节点的值,如果对二叉查找树进行中序遍历,将按照从小到大的顺序输出树里面的所有元素。

2.头文件:BinatyTree.h

#ifndef   _TREE_H
#define   _TREE_H

#include<iostream>
using namespace std;


struct TreeNode;
typedef  int  ElementType;
typedef  struct  TreeNode*   Position;
typedef  struct  TreeNode*   SearchTree;

struct TreeNode//树结点结构体
{
	ElementType  Element;//树结点元素
	SearchTree   Left;//指向左子树的指针
	SearchTree   Right;//指向右子树的指针
};

SearchTree MakeEmpty(SearchTree  T);//清空一棵树
Position  Find(ElementType X, SearchTree  T);//在树T中寻找元素X,并且返回指向该元素的指针
Position  FindMin(SearchTree  T);//寻找树T中的最小元素,并且返回指向该元素的指针
Position  FindMax(SearchTree  T);//寻找树T中的最大元素,并且返回指向该元素的指针
SearchTree Insert(ElementType X, SearchTree  &T);//一定要加&号;插入元素X
SearchTree Delete(ElementType X, SearchTree  T);//删除元素X
void InSort(SearchTree T);//中序遍历




#endif

3.实现源文件:BinatyTree.cpp

#include"tree.h"


//清空一棵树
SearchTree MakeEmpty(SearchTree  T)
{
	if(T!=NULL)
	{
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);

		free(T);
	}

	return NULL;
}


//插入元素X
SearchTree Insert(ElementType X, SearchTree  &T)//一定要加&号
{
	if (T == NULL)
	{
		T =(SearchTree)malloc(sizeof(TreeNode));
		if (T == NULL)
		{
			cout << "Out of space!!!" << endl;
			return NULL;
		}

		else
		{
			T->Element = X;
			T->Left = T->Right = NULL;
		}

	}

	else if (X > T->Element)
	{
		T->Right = Insert(X, T->Right);
	}

	else if (X < T->Element)
	{
		T->Left = Insert(X, T->Left);
	}

	return T;
}


//在树T中寻找元素X,并且返回指向该元素的指针
Position  Find(ElementType X, SearchTree  T)
{
	if (T == NULL)
	{
		return NULL;
	}

	if (X < T->Element)
	{
		return  Find(X, T->Left);
	}


	else if (X > T->Element)
	{
		return  Find(X, T->Right);
	}

	else
		return T;
}


//寻找树T中的最小元素,并且返回指向该元素的指针
Position  FindMin(SearchTree  T)
{
	if (T == NULL)
		return NULL;

	else if (T->Left == NULL)
		return T;

	else
		return FindMin(T->Left);
}


//寻找树T中的最大元素,并且返回指向该元素的指针
Position  FindMax(SearchTree  T)
{
	if (T != NULL)
	while(T->Right != NULL)
		T=T->Right;

		return T;
}


//删除元素X
SearchTree Delete(ElementType X, SearchTree  T)
{
	Position  TmpCell;
	if (T == NULL)
	{
		cout << "Element  not found!!" << endl;
	}

	else if (X < T->Element)
	{
		T->Left = Delete(X, T->Left);
	}

	else if (X > T->Element)
	{
		T->Right = Delete(X, T->Right);
	}

	else if (T->Left && T->Right)
	{
		Position ptr = FindMin(T->Right);
		T->Element =ptr->Element;
		T->Right=Delete(T->Element, T->Right);
	}

	else
	{
		TmpCell = T;
		if (T->Left == NULL)
		{
			T = T->Right;
		}
		else if (T->Right == NULL)
		{
			T = T->Left;
		}

		free(TmpCell);
	}

	return T;
}


void InSort(SearchTree T)//中序遍历
{
	if (T)
	{
		InSort(T->Left);
		cout<<T->Element<<" ";
		InSort(T->Right);
	}
}

4.主程序:main.cpp

#include"tree.h"


int main()
{
	SearchTree  T = NULL;
	Position Minposition=NULL;
	Position Maxposition=NULL;
	Position tmpposition=NULL;
	

	//依次插入数据8,5,3,7,12,23,20,25
		Insert(8, T);
		Insert(5, T);
		Insert(3, T);
		Insert(7, T);
		Insert(12, T);
		Insert(23, T);
		Insert(20, T);
		Insert(25, T);
	
		for (int i = 1; i < 20; i++)
		{
			Insert(i,T);
		}
		Delete(0, T);
		InSort(T);
		cout << endl;
	tmpposition=Find(5, T);//寻找元素5,返回指向5的指针
	cout << "二叉树中5的左子为:" << tmpposition->Left->Element << endl;//打印元素5的左子树的元素
	cout << "二叉树中5的右子为:" << tmpposition->Right->Element << endl;//打印元素5的右子树的元素


	tmpposition = Find(23, T);//寻找元素23,返回指向23的指针
	cout << "二叉树中23的左子为:" << tmpposition->Left->Element << endl;//打印元素23的左子树的元素
	cout << "二叉树中23的右子为:" << tmpposition->Right->Element << endl;//打印元素23的右子树的元素


	Minposition=FindMin(T);//寻找树中的最小元素
	cout <<"二叉树中最小值为:" <<Minposition->Element << endl;

	Maxposition=FindMax(T);//寻找树中的最大元素
	cout << "二叉树中最大值为:" << Maxposition->Element << endl;


	return 0;
}

5.运行结果
在这里插入图片描述
6.附:树的知识点思维导图
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值