二叉搜索树
来源:互联网 发布:淘宝门头在线制作 编辑:程序博客网 时间:2024/06/06 02:00
#include <stdio.h>#include <string.h>#include <stdlib.h>//插入和删除函数必须都得以返回指针的形式实现//对于插入,看其最后的NULL时插入就能看出//对于删除,本质删除的是只有一个儿子和没有儿子的节点,想其删除没有儿子的节点的情况//若不返回指针,此节点的父亲就有个指针指向非法区了struct TreeNode{int Element;struct TreeNode* Left;struct TreeNode* Right;};struct TreeNode* Init(){//初始化return NULL;}void PreTraversal(struct TreeNode* BinSearchTree)//前序遍历 { if(BinSearchTree!=NULL){ printf("%d ",BinSearchTree->Element); PreTraversal(BinSearchTree->Left); PreTraversal(BinSearchTree->Right); } return; } struct TreeNode* Find(int data,struct TreeNode* BinSearchTree)//查找{if(BinSearchTree==NULL)return NULL;else if(BinSearchTree->Left!=NULL&&data<BinSearchTree->Element)return BinSearchTree->Left;else if(BinSearchTree->Right!=NULL&&data>BinSearchTree->Element)return BinSearchTree->Right;else return BinSearchTree;}struct TreeNode* FindMax(struct TreeNode* BinSearchTree)//查找最大值所在的节点{if(BinSearchTree==NULL)return NULL;else if(BinSearchTree->Right!=NULL)return FindMax(BinSearchTree->Right);elsereturn BinSearchTree;}struct TreeNode* FindMin(struct TreeNode* BinSearchTree)//查找最小值所在的节点{if(BinSearchTree==NULL)return NULL;else if(BinSearchTree->Left!=NULL)return FindMin(BinSearchTree->Left);elsereturn BinSearchTree;}struct TreeNode* Insert(int data,struct TreeNode* BinSearchTree)//插入{if(BinSearchTree==NULL){BinSearchTree=(struct TreeNode*)malloc(sizeof(struct TreeNode));BinSearchTree->Element=data;BinSearchTree->Left=NULL;BinSearchTree->Right=NULL;return BinSearchTree;}else if(data<BinSearchTree->Element)BinSearchTree->Left=Insert(data,BinSearchTree->Left);else if(data>BinSearchTree->Element)BinSearchTree->Right=Insert(data,BinSearchTree->Right);elseprintf("ERROR\n");return BinSearchTree;}struct TreeNode* Delete(int data,struct TreeNode* BinSearchTree)//删除{if(BinSearchTree==NULL)return NULL;else if(data>BinSearchTree->Element)BinSearchTree->Right=Delete(data,BinSearchTree->Right);else if(data<BinSearchTree->Element)BinSearchTree->Left=Delete(data,BinSearchTree->Left);else if(BinSearchTree->Left&&BinSearchTree->Right){//删除有两个孩子的节点,可找左树最大与右树最小代替其,本质删除没有儿子的节点struct TreeNode* Temp=FindMin(BinSearchTree->Right);BinSearchTree->Element=Temp->Element;BinSearchTree->Right=Delete(Temp->Element,BinSearchTree->Right);}else{//删除有一个/零个孩子的节点struct TreeNode* Temp;Temp=BinSearchTree;if(BinSearchTree->Left!=NULL)BinSearchTree=BinSearchTree->Left;else//此处包含了右儿子也为空的情况,即零个孩子BinSearchTree=BinSearchTree->Right;free(Temp);}return BinSearchTree;}int main(){struct TreeNode* BinSearchTree; //初始化 BinSearchTree=Init(); //插入 BinSearchTree=Insert(4,BinSearchTree); BinSearchTree=Insert(3,BinSearchTree); BinSearchTree=Insert(6,BinSearchTree); BinSearchTree=Insert(5,BinSearchTree); BinSearchTree=Insert(7,BinSearchTree); BinSearchTree=Insert(2,BinSearchTree); //遍历一遍,便于检验代码 PreTraversal(BinSearchTree); putchar('\n'); //删除有零个孩子的2节点 BinSearchTree=Delete(2,BinSearchTree); PreTraversal(BinSearchTree); putchar('\n'); //重新插入2 BinSearchTree=Insert(2,BinSearchTree); //删除有一个孩子的3节点 Delete(3,BinSearchTree); PreTraversal(BinSearchTree); putchar('\n'); //删除有两个孩子的6节点 Delete(6,BinSearchTree); PreTraversal(BinSearchTree); putchar('\n'); }
1 0
- 【二叉搜索数】HDU3791二叉搜索树
- 二叉树--二叉搜索树
- 【二叉树】二叉搜索树
- 二叉树- 二叉搜索树
- 【搜索树】二叉搜索树
- 二叉搜索树BSTree
- 二叉搜索树
- 二叉搜索树
- 二叉搜索树
- 最优二叉搜索树
- 二叉搜索树
- 二叉搜索树
- HDOJ3791 二叉搜索树
- 二叉查找树搜索
- 二叉搜索树
- 二叉搜索树
- BST 二叉搜索树
- 二叉搜索树
- 正则表达式详解
- JAVA+Ftp 操作
- java获取本机IP 系统时间
- usaco Prime Palindromes
- Homebrew的安装和使用
- 二叉搜索树
- 机房那些事儿---为梦想时刻准备着之机房准备
- ContentProvider从入门到精通
- RedHat删除自带openJdk
- C++ 类访问控制(public/protected/private)
- 11.2考试整理
- Sharding JDBC源码分析-JdbcMethodInvocation类的作用
- LeetCode No.24 Swap Nodes in Pairs
- Fiddler 教程