#include<iostream>
using namespace std;
typedef struct TreeNode
{
char Data;
TreeNode* Left;
TreeNode* Right;
}*BinTree;
BinTree Insert(BinTree &T, char e)//要传T的引用
{
if (T==NULL)
{
T = (BinTree)malloc(sizeof(TreeNode));
T->Data = e;
T->Left = NULL;
T->Right = NULL;
}
if (e < T->Data)
T->Left = Insert(T->Left, e);
else if (e>T->Data)
T->Right = Insert(T->Right, e);
return T;
}
void InOrderTraversal(BinTree T)
{
if (T)
{
InOrderTraversal(T->Left);
printf("%c", T->Data);
InOrderTraversal(T->Right);
}
}
bool Delete(BinTree &BT, char e)
{
BinTree T = BT;
BinTree PT = NULL;
bool solved = false;
while (T!=NULL)
{
if (e < T->Data)
{
PT = T;
T = T->Left;
}
else if (e>T->Data)
{
PT = T;
T = T->Right;
}
else
{
if (T->Left == NULL&&T->Right == NULL)//删除节点为叶子节点时
{
if (T == BT)
BT = NULL;
else if (T == PT->Left)
PT->Left = NULL;
else
PT->Right = NULL;
free(T);
return true;
}
else if (T->Left == NULL || T->Right == NULL)//T为单支树
{
if (T == BT)
{
if (T->Left == NULL)
BT = T->Right;
else
{
BT = T->Left;
}
}
if (PT->Left == T&&T->Left)
PT->Left = T->Left;
else if (PT->Left == T&&T->Right)
PT->Left = T->Right;
else if (PT->Right == T&&T->Left)
PT->Right = T->Left;
else
PT->Right = T->Right;
free(T);
return true;
}
else//左右子树均不空
{
BinTree Plater = T;
BinTree later = T->Right;
while (later->Left != NULL)
{
Plater = later;
later = later->Left;
}
//循环出来后later为T的直接后继
T->Data = later->Data;
if (T == Plater)
T->Right = later->Left;
else
Plater->Left = later->Right;
free(later);
return true;
}
}
//return true;
}
return false;
}
bool find(BinTree T,char e)
{
if (T == NULL)
return NULL;
if (e < T->Data)
find(T->Left,e);
else if (T->Data < e)
find(T->Right, e);
else
return true;
}
int main()
{
BinTree T = NULL;
T=Insert(T, 'D');
T = Insert(T, 'B');
T = Insert(T, 'C');
T = Insert(T, 'A');
InOrderTraversal(T);
cout<<Delete(T, 'B')<<endl;
InOrderTraversal(T);
return 0;
}
BST的插入、删除、查找操作
最新推荐文章于 2021-10-27 10:13:56 发布