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

二叉搜索树的删除:

在删除之前需要从树中查找到这个节点,然后再针对情况来判断如何删除。

分为三种情况,首先是此节点没有孩子节点,此节点有一个孩子节点,此节点有两个孩子节点

void Delete(BinTree*& root,int value)
{
	BinTree* delnode= NULL;
	if(root == NULL)
		return ;
	BinTree* temp = root;
	BinTree* parent =NULL;
	while(temp!=NULL)
	{
		if(temp->value == value)
			break;
		else
		{
			parent = temp;
			if(temp->value >value)
				temp = temp->left;
			else
				temp =temp->right;
		}

	}
	if(temp ==NULL)
		return ;
	delnode = temp;
	// 删除的节点被找到 根据被删除的节点的情况来判断
	// 如果节点的没有孩子 那么直接删除此节点
	if(delnode->right ==NULL && delnode->left ==NULL)
	{
		cout<<"==="<<endl;
		//cout<<parent->value<<endl;
		if(delnode == root)
		{
			root=NULL;
		}
		if(parent && parent->left == delnode)
		{
			parent->left = NULL;
		}
		if(parent && parent->right == delnode)
			parent->right =NULL;
		delete delnode;
	}
	//如果此节点有一个孩子
	if(delnode->right != NULL && delnode->left==NULL)
	{
		if(parent !=NULL)
		{
			if(parent->left == delnode)
				parent->left = delnode->right;
			else if(parent->right == delnode)
				parent->right = delnode->right;

		}
		else
		{
			root = delnode->right;
		}
		delete delnode;

	}
	if(delnode->left !=NULL&&delnode->right== NULL)
	{
		if(parent !=NULL)
		{
			if(parent->left == delnode)
				parent->left = delnode->left;
			else if(parent->right = delnode)
				parent->right = delnode->right;
		}
		else
		{
			root = delnode->left;
		}
		delete delnode;
	}
	//两个节点都不为空
	if(delnode->left !=NULL && delnode->right !=NULL)
	{
		temp = delnode->right;
		parent = delnode;
		while(temp->left !=NULL)
		{
			parent = temp;
			temp = temp->left;
		}
		delnode->value = temp->value;
		parent->left = temp->right;
		delete temp;
		//Delete(delnode->right,temp->value);
	}
} 
时间: 2024-10-26 10:43:36

二叉搜索树的创建 && 查找 & 插入 & 删除的相关文章

【数据结构】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

二叉搜索树的创建

class Btreenode: #创建树 def __init__(self,data): self.data=data self.lchild=None self.rchild=None class BTS: def __init__(self,li): self.root=None for i in li: self.insert(i) def insert(self,key): #书中插入一个值 if not self.root: self.root=Btreenode(key) #没有

PHP 二叉查找树(二叉搜索树)的查找

如下图:在二叉查找树中,搜索节点19是否存在 代码实现: 测试结果: 原文地址:https://www.cnblogs.com/qiangqiangge/p/12283930.html

二叉搜索树的相关操作

操作包括二叉搜索树的创建,插入,搜索,寻找前驱后继,删除,左右旋转,插入元素为根结点,以及两棵二叉树的合并. 二叉树的创建很简单,只需要设置 value, left child, right child 即可. 插入的时候递归插入树中合适的位置,通过比较插入元素的值与根结点元素的值,如果小于则递归插入到左子树中,否则递归插入到右子树中. 搜索的时候与插入类似,比较要搜索的值和根结点元素值的大小,若小于则递归到左子树中去查找,否则递归到右子树中去查找. 寻找前驱的方式是在左子树的右结点中去递归寻找

二叉搜索树建立、插入、删除、前继节点、后继节点之c++实现

一.前言 一直以来,都对树有关的东西望而却步.以前每次说要看一看,都因为惰性,时间就那么荒废掉了.今天下个决心,决定好好的数据结构中的东西看一下.不知道看这篇文章的你,是不是和我有同样的感受,空有一颗努力的心,却迟迟没有付出行动.如果是的话,如果也想好好的把树的知识巩固一下的话,就让我们一起好好儿地把知识点过一遍吧.本文争取让看完的每一个没有基础的同学,都能有所收获.在正文开始前,先给自己加个油.加油(^ω^) 二.二叉搜索树的定义 二叉搜索树是指,对于某一个节点而言,它左边的节点都小于或等于它

二叉搜索树的插入

--------------------siwuxie095 二叉树的插入 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; No

二叉搜索树的查找

---------------------siwuxie095 二叉搜索树的查找 程序:二叉搜索树和顺序查找表的查找对比 FileOps.h: #ifndef FILEOPS_H #define FILEOPS_H #include <string> #include <iostream> #include <fstream> #include <vector> using namespace std; namespace FileOps { int fir

二叉搜索树的删除

-------------------siwuxie095 二叉搜索树的删除 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; N

C++实现二叉搜索树的常用操作

实现操作 (1)二叉搜索树的建立 (2)二叉搜索树的插入 (3)二叉搜索树的三种递归遍历(前序.中序和后续) (4)二叉搜索树的三种非递归遍历(前序.中序和后续) (5)二叉搜索树的逐层打印 (6)搜索某一个字符(递归算法) (7)搜索一个字符(非递归算法) (8)查找最大元素 (9)查找最小元素 有时间再实现: (10)二叉搜索树的前驱和后继查找 (11)二叉搜索树的删除 源码分析: #include <iostream> #include <stack> #include &l