<数据结构>BinarySearchTree的基本操作总结
ADT
结构声明#
#include<stdio.h>
#include<stdlib.h>
#define ElementType int
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
核心操作集#
Position Find(int X, SearchTree T);
SearchTree Insert(int X, SearchTree T);
SearchTree Delete(int X, SearchTree T);
void PreOrderTraversal(SearchTree BT);
void InOrderTraversal(SearchTree BT);
void PostOrderTraversal(SearchTree BT);
void LevelOrderTraversal(SearchTree BT);
各操作实现
说明:SearchTree是递归定义,故操作多以递归实现,不再尝试转换为非递归实现
Find(),Insert(),Delete()#
Position Find(int 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;
}
SearchTree Insert(int X, SearchTree T)
{
if(T == NULL)
{
/*creat and return a one-node tree*/
T = (SearchTree)malloc(sizeof(struct TreeNode));
T->Element = X;
T->Left = T->Right = NULL;
}
else
if(X < T->Element)
T->Left = Insert(X, T->Left);
else
if(X > T->Element)
T->Right = Insert(X, T->Right);
return T;
}
SearchTree Delete(int X, SearchTree T)
{
Position TmpCell;
if(T == NULL)
printf("Element not found");
else
if(X < T->Element) /*Go Left*/
T->Left = Delete(X, T->Left);
else
if(X > T->Element) /*Go Right*/
T->Right = Delete(X, T->Right);
else
if(T->Left && T->Right) /*Two children*/
{
TmpCell = FindMax(T->Right);
T->Element = TmpCell->Element;
T->Right = Delete(T->Element, T->Right);
}
else /*One or Zero Children*/
{
TmpCell = T;
if(T->Left == NULL)
T = T->Right;
if(T->Right == NULL)
T = T->Left;
free(TmpCell);
}
return T;
}
Traverse():前中后、层#
void PreOrderTraverse(BinaryTree BT)
{
if(BT)
{
printf("%d", BT->Element);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
InOrderTraverse()以及PostOrderTraverse()只需改变'printf()'位置即可'
void LevelOrderTraversal(BinaryTree BT)
{
/*手法类似于BFS*/
queue<BinaryTree> Q;
BinaryTree T;
if(!BT) return;
Q.push(BT);
while(!Q.empty())
{
T = Q.front();
printf("%d ",T->Element);
Q.pop();
if(T->Left) Q.push(T->Left);
if(T->Right) Q.push(T->Right);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用