二叉数组的创建删除插入查找

#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode *BinTree;   //定义一个对象指针
typedef BinTree Position;           //定义一个对象指针名
struct TreeNode{
	int Data;
	BinTree Left;
	BinTree Right;
};

//二叉搜索数的查找Find
Position Find(int x,BinTree BST)
{
	if(!BST)          //判断BST是否为空
		return NULL;
	if(x > BST->Data)
		return Find(x,BST->Right); //在右指数继续查找
	else if(x < BST->Data)         //在左指数继续查找
		return Find(x,BST->Left);
	else
		return BST;                //查找成功
}

//二叉搜索数的查找Find  非递归实现
Position IterFind(int x,BinTree BST)
{
	while(BST)
	{
		if(x > BST->Data)
			BST = BST->Right;
		else if(x < BST->Data)
			BST = BST->Left;
		else
			return BST;
	}
	return NULL;
}

Position FindMin(BinTree BST)
{
	if(!BST)
		return NULL;
	else if(!BST->Left)     //找到左叶结点并返回
		return BST;
	else
		return FindMin(BST->Left);
}

Position FindMax(BinTree BST)
{
	if(BST)
		while(BST->Right)
			BST = BST->Right;
	return BST;
}

//二叉搜索数的插入算法 适用于带头结点的二叉树
BinTree Insert(int x,BinTree BST)
{
	if(!BST)       //判断传入指针是否为空
	{
		BST = new TreeNode;
		BST->Data = x;
		BST->Left = BST->Right = NULL;
	}else
		if(x < BST->Data)
			BST->Left = Insert(x,BST->Left);
		else if(x > BST->Data)
			BST->Right = Insert(x,BST->Right);
	return BST;   //如果都不执行就返回
}

//搜索二叉数的删除
BinTree Delete(int x,BinTree BST)
{
	Position Tmp;
	if(!BST)
		printf("删除的元素未找到");
	else if(x < BST->Data)
		BST->Left = Delete(x,BST->Left);
	else if(x > BST->Data)
		BST->Right = Delete(x,BST->Right);
	else
	{
		if(BST->Left&&BST->Right)   //被删除的结点含有左右两个子结点
		{
			Tmp = FindMin(BST->Right);   //在右指数中去找最小值替代被删除元素
			BST->Data = Tmp->Data;
			BST->Right = Delete(BST->Data,BST->Right);  //在删除元素的右边去把最小值那个结点删除掉
		}
		else
		{
			Tmp = BST;
			if(!BST->Left)         //有右孩纸或无结点
				BST = BST->Right;
			else if(!BST->Right)
				BST = BST->Left;		//有左孩纸或无结点
			free(Tmp);
		}

	}
	return BST;
}

void showBinTree(BinTree BST)
{
	if(BST)         //用if判断便于返回
	{
		showBinTree(BST->Left);
		showBinTree(BST->Right);
		printf("%d\n",BST->Data);
	}

}

int main()
{
	TreeNode *a = new TreeNode;
	a->Data = 9;
	a->Left = NULL;
	a->Right = NULL;
	a = Insert(5,a);
	a = Insert(6,a);
	a = Insert(10,a);
	a = Insert(13,a);
	a = Delete(5,a);
	showBinTree(a);
	system("pause");
}

//测试数据  1 5 2 6 4
//测试数据  9 5 6 10 13

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 13:30:47

二叉数组的创建删除插入查找的相关文章

二叉数组的创建以及后续遍历

//二叉数组的创建 #include<stdio.h> #include<stdlib.h> #define MaxSize 100 typedef struct node { char data; struct node *lchild,*rchild; }BTNode;              //二叉数组的基本结点 //创建二叉数组传入一个头结点传入一个字符数组 void CreateBTree(BTNode* &bt,char *str) { BTNode *st

【数据结构】5.2 二叉搜索树的创建查找以及插入操作

TAG 此代码遇到一个bug,在Insert函数中,注释部分,思考一下为什么用这个方法来添加会失效 #include<iostream> using namespace std; struct BTNode { int data; BTNode *lchild,*rchild; }; void selectsort(int a[], int n) { for (int i = 1; i < n; i++) { for (int j = i + 1; j < n; j++) { if

JS—二维数组的创建

//二维数组的创建 //方法一: var myarr = new Array(); //先声明一维 for ( var i = 0; i < 2; i++) { //一维长度为2 myarr[i] = new Array(); //再声明二维 for ( var j = 0; j < 3; j++) { //二维长度为3 myarr[i][j] = i + j; // 赋值,每个数组元素的值为i+j } } //方法二: var myarr1 = [ [ 0, 1, 2 ], [ 1, 2,

Elasticsearch Java API (二): index创建删除 cluster管理

Elasticsearch Java API (二): index创建删除 cluster管理  elastic官网有权威的java api 英文的 需要耐心看 这里整理下基本操作 创建maven工程添加依赖 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.2.2</ver

二叉数组的基本操作

//二叉数组的输出 void DisBTree(BTNode* bt) { if(bt) { DisBTree(bt->lchild); DisBTree(bt->rchild); printf("%c ""\n",bt->data); } } //二叉数组的高度 int BTHeight(BTNode *bt) { int lchilddep,rchilddep; if(bt == NULL) return 0; //递归终止条件 else {

二叉搜索树的创建 &amp;&amp; 查找 &amp; 插入 &amp; 删除

二叉搜索树的删除: 在删除之前需要从树中查找到这个节点,然后再针对情况来判断如何删除. 分为三种情况,首先是此节点没有孩子节点,此节点有一个孩子节点,此节点有两个孩子节点 void Delete(BinTree*& root,int value) { BinTree* delnode= NULL; if(root == NULL) return ; BinTree* temp = root; BinTree* parent =NULL; while(temp!=NULL) { if(temp-&g

可变数组:创建 添加 插入 删除 替换

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //可变数组继承不可变数组 //1创建 设定元素个数进行创建 NSMutableArray *str=[NSMutableArray arrayWithCapacity:7]; //2想数组中添加一个元素 NSArray *[email protected][@"MON",@"

二叉线索树-创建中序二叉线索树、查找前驱、查找后继、按照前驱或后继遍历

#include <iostream> #include <stack> using namespace std; struct BiThrNode { int data; BiThrNode *left; BiThrNode *right; bool ltag;//0表示left指向左子,1表示left指向直接前驱 bool rtag; //BiThrNode(int val,BiThrNode *l,BiThrNode *r,bool lt,bool rt):data(val)

Java实现二叉搜索树节点的删除

前言: 之前写过一篇关于二叉搜索树的博客:Java对二叉搜索树进行插入.查找.遍历.最大值和最小值的操作  二叉查找树重要性质: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: 如图: 这次我想分享的是二叉搜索树中节点是如何删除的,删除节点是二叉搜索树常用的一般操作中最复杂的,删除节点要从查找要删除的节点开始入手 ,找到节点后,这个要删除的节点可能会有三种情况需要考虑: 1