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.附:树的知识点思维导图