二叉搜索树的常用操作

2024-09-01 19:08
文章标签 操作 搜索 二叉 常用

本文主要是介绍二叉搜索树的常用操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考 :http://blog.csdn.net/wanmeiwushang/article/details/51921821


#include <stdio.h>
#include <stdlib.h>typedef enum {false,true}bool;
typedef int ElementType;
typedef struct TNode* BinTree;
struct TNode{ElementType data;BinTree Left;BinTree Right;
};BinTree BuildTree();
bool IsBST(BinTree T);
int maxValue(BinTree T);
int minValue(BinTree T);
void PreOrderTraverse(BinTree T);
void InOrderTraverse(BinTree T);
void PostOrderTraverse(BinTree T);BinTree Insert(BinTree T, ElementType X);
BinTree Delete(BinTree T, ElementType X );
BinTree FindMin( BinTree T );
BinTree FindMax( BinTree T );BinTree Find( BinTree BST, ElementType X );int main(){BinTree T;T=BuildTree();if(IsBST(T))printf("YES!\n");elseprintf("NO!\n");printf("PreOrder: ");PreOrderTraverse(T);printf("\n");printf("InOrder: ");InOrderTraverse(T);printf("\n");printf("PostOrder: ");PostOrderTraverse(T);printf("\n");Delete(T, 3);Delete(T, 7);printf("PreOrder: ");PreOrderTraverse(T);printf("\n");T = Find(T, 5);printf("T->data = %d\n", T->data);return 0;
}
/* 4 3 1 -1 2 -1 -1 -1 5 -1 7 6 -1 -1 8 -1 -1 4 */  
//PreOrder:  4 3 1 2 5 7 6 8
//InOrder:   1 2 3 4 5 6 7 8
//PostOrder: 2 1 3 6 8 7 5 4BinTree BuildTree(){BinTree T=NULL;ElementType val;scanf("%d", &val);if(val==-1)return T;T = (BinTree)malloc(sizeof(struct TNode));T->data = val;T->Left = BuildTree();T->Right = BuildTree();return T;
}bool IsBST(BinTree T){if(T==NULL)return true;if(T->Left!=NULL&&maxValue(T->Left)>T->data)return false;if(T->Right!=NULL&&maxValue(T->Right)<=T->data)return false;return IsBST(T->Left)&&IsBST(T->Right);
}int maxValue(BinTree T){BinTree p;int max;max=T->data;p=T->Left;while(p){if(max<p->data)max=p->data;p=p->Left;}return max;
}int minValue(BinTree T){BinTree p;int min;min=T->data;p=T->Right;while(p){if(min>p->data)min=p->data;p=p->Right;}return min;
}void PreOrderTraverse(BinTree T){if(T==NULL)return;printf("%d ", T->data);PreOrderTraverse(T->Left);PreOrderTraverse(T->Right);
}
void InOrderTraverse(BinTree T){if(T==NULL)return;InOrderTraverse(T->Left);printf("%d ", T->data);InOrderTraverse(T->Right);
}
void PostOrderTraverse(BinTree T){if(T==NULL)return;PostOrderTraverse(T->Left);PostOrderTraverse(T->Right);printf("%d ", T->data);
}BinTree Insert(BinTree T, ElementType X){if(T==NULL){T = (BinTree)malloc(sizeof(struct TNode));T->data = X;T->Left = NULL;T->Right = NULL;}else{if(X<T->data)T->Left=Insert(T->Left, X);else if(X>T->data)T->Right=Insert(T->Right, X);}return T;
}
BinTree Delete(BinTree T, ElementType X ){BinTree tmp;if(NULL==T){printf("Not Found!\n");return T;}if(X<T->data)T->Left=Delete(T->Left, X);else if(X>T->data)T->Right=Delete(T->Right, X);else{if(T->Left&&T->Right){tmp = FindMin(T->Right);T->data=tmp->data;T->Right = Delete(T->Right, T->data);		}else{tmp = T;  if(T->Left==NULL)  T=T->Right;  else if(T->Right==NULL)  T=T->Left;free(tmp);  }}return T;
}
BinTree FindMin( BinTree T ){if(T){while(T->Left)T=T->Left;}return T;
}
BinTree FindMax( BinTree T ){if(T){while(T->Right)T=T->Right;}return T;
}BinTree Find( BinTree T, ElementType X ){if(NULL==T)return NULL;if(X<T->data)return Find(T->Left, X);else if(X>T->data)return Find(T->Right, X);elsereturn T;
}


这篇关于二叉搜索树的常用操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127790

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;