二叉搜索树的实现

本文详细介绍了二叉搜索树的插入与删除操作的具体实现方式。通过递归和循环的方法,实现了元素的正确插入和高效删除,确保了二叉搜索树的特性得以保持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// BinarySearchTree.h: interface for the BinarySearchTree class.
//
//////////////////////////////////////////////////////////////////////
#include "BinaryTreeNode.h"
#include "BinaryTree1.h"

#if !defined(AFX_BINARYSEARCHTREE_H__1CD2FF9D_73F2_4194_974A_12892DFB325F__INCLUDED_)
#define AFX_BINARYSEARCHTREE_H__1CD2FF9D_73F2_4194_974A_12892DFB325F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

template <class T>
class BinarySearchTree:public BinaryTree<T>
{
public:
 BinarySearchTree(){};
 virtual ~BinarySearchTree(){};
 void InsertNode(BinaryTreeNode<T>* root,BinaryTreeNode<T>* newpointer);
 void DeleteNode(BinaryTreeNode<T>* pointer);
 void DeleteNodeEx(BinaryTreeNode<T>* pointer);
};
template <class T>
void BinarySearchTree<T>::InsertNode(BinaryTreeNode<T>* root,BinaryTreeNode<T>* newpointer)
{
 BinaryTreeNode<T>* pointer=NULL;
 //初始化
 if(NULL==root)
 {
  //用指针newpointer初始化二叉搜索树树根,赋值实现
  Initialize(newpointer);
  return;
 }
 else pointer=root;
 while(1)
 {
  if(newpointer->value()==pointer->value())
   return ;         //相等则不用插入
  else if(newpointer->value()<pointer->value()) //作为左子树
  {
   if(pointer->leftchild()==NULL)    
   {
    pointer->left=newpointer;
    return;
   }
   else pointer=pointer->leftchild();

  }
  else{           //作为右子树
   if(pointer->rightchild()==NULL)
   {
    pointer->right=newpointer;
    return;
   }
   else pointer=pointer->rightchild();
  }
 }
}
template <class T>
void BinarySearchTree<T>::DeleteNode(BinaryTreeNode<T>* pointer)
{//二叉搜索树的删除
 BinaryTreeNode<T>* temppointer=NULL; 
 if(!pointer)
  return;
 BinaryTreeNode<T>* parent=GetParent(root,pointer);
 //被删结点无左子树吗?
 if(NULL==pointer->leftchild())
 {
  //被删除结点是根结点吗?
  if(NULL==parent)
   root=pointer->rightchild();
  else if(parent->leftchild()==pointer)
   parent->left=pointer->rightchild();
  else
   parent->right=pointer->rightchild();
  delete pointer;
  pointer=NULL;
  return;
 }
 else temppointer=pointer->leftchild();
 //在左子树中找对称序的最后一个结点
 while(temppointer->rightchild()!=NULL)
  temppointer=temppointer->rightchild();
 //被删除结点的右子树作为temppointer的右子树
 temppointer->right=pointer->rightchild();
 //被删除结点的左子树根代替被删除结点
 if(parent==NULL)
  root=pointer->leftchild();
 else if(parent->leftchild()==pointer)
  parent->left=pointer->leftchild();
 else
  parent->right=pointer->leftchild();
 delete pointer;
 pointer=NULL;
 return;
}

template <class T>
void BinarySearchTree<T>::DeleteNodeEx(BinaryTreeNode<T>* pointer)
{
 //如果带删除节点不存在,返回
 if( pointer == NULL )
  return;
 //保存要替换上来的节点
 BinaryTreeNode<T> * temppointer;
 //保存要替换上来的节点的父节点
 BinaryTreeNode<T> * tempparent = NULL;
 //保存要删除节点的父节点
 BinaryTreeNode<T> * parent = GetParent(root ,pointer );

 //如果待删除节点的左子树为空,就将它的右子树代替它即可
 if( pointer->leftchild() == NULL )
 {
  //将右子树连到待删除节点的父的合适位置
  if( parent == NULL )
   root = pointer->rightchild();
  else if( parent->leftchild() == pointer )
   parent->left = pointer->rightchild();
  else
   parent->right = pointer->rightchild();
  delete pointer;
  pointer=NULL;
  return;
 }

 //当待删除节点左子树不为空,就在左子树中寻找最大节点替换待删除节点
 temppointer = pointer->leftchild();
 while(temppointer->rightchild() != NULL )
 {
  tempparent = temppointer;
  temppointer = temppointer->rightchild();
 }

 //删除替换结点
 if(tempparent==NULL)
  pointer->left=temppointer->leftchild();
 else
  tempparent->right=temppointer->leftchild();

 //用替换结点去替代真正的删除结点
 if(parent==NULL)
  root=temppointer;
 else if( parent->leftchild() == pointer )
       parent->left=temppointer;
   else parent->right=temppointer;

 temppointer->left=pointer->leftchild();
 temppointer->right=pointer->rightchild();

 delete pointer;
 pointer=NULL;
 return;
}

#endif // !defined(AFX_BINARYSEARCHTREE_H__1CD2FF9D_73F2_4194_974A_12892DFB325F__INCLUDED_)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值