1.二叉搜索树抽象模型和相应的node对象表示
2.从二叉搜索树删除一个节点
(1)如果是叶子节点就直接删除
(2)被删除的节点有左节点,但没有右节点,则将左节点连接到父节点上,例如删除下图节点35
(3)被删除的节点有右节点,但没有左节点,则将右节点连接到父节点上,例如删除下图节点26
(4)被删除的节点有左右节点,选择该节点右子树最左边的节点来替换,此时分两组情况:
pNodePtr:dNodePtr的父节点
dNodeptr:将被删除的节点
pOfRNodePtr:替代节点的父节点
rNodePtr: 替代节点
*右节点的左子树为空,则不需要再往左下降,例如删除下图的节点25
*右节点的左子树不为空,则沿着左子树下降,直到到达叶子节点,例如删除下图的节点30
实现代码:
(由于篇幅的关系,详见C++数据结构——二叉搜索树迭代器的实现)
BSTree.h
#ifndef BS_Tree_H
#define BS_Tree_H
#include"node.h"
#include<iostream>
#include<queue>
using namespace std;
template<typename T>
class bs_Tree
{
friend class myIterator;
private:
node<T> *root; //二叉搜索树根节点
//以后序遍历方式复制二叉搜索树,返回根节点
node<T> * copyBSTree(node<T> *root)
{
node<T> *p=nullptr; //根节点
node<T> *l=nullptr; //左子树
node<T> *r=nullptr; //右子树
if(!root) //递归结束条件
{
return nullptr;
}
else
{
l=copyBSTree(root->left); //递归复制左子树
r=copyBSTree(root->right); //递归复制右子树
p=new node<T>(root->val,nullptr,l,r);
if(l)
{
l->parent=p;
}
if(r)
{
r->parent=p;
}
}
return p;
}
//以后序遍历方式删除二叉搜索树,
void deleteBSTree(node<T>* root)
{
if(!root) //递归结束条件
{
return;
}
else
{
2.从二叉搜索树删除一个节点
(1)如果是叶子节点就直接删除
(2)被删除的节点有左节点,但没有右节点,则将左节点连接到父节点上,例如删除下图节点35
(3)被删除的节点有右节点,但没有左节点,则将右节点连接到父节点上,例如删除下图节点26
(4)被删除的节点有左右节点,选择该节点右子树最左边的节点来替换,此时分两组情况:
pNodePtr:dNodePtr的父节点
dNodeptr:将被删除的节点
pOfRNodePtr:替代节点的父节点
rNodePtr: 替代节点
*右节点的左子树为空,则不需要再往左下降,例如删除下图的节点25
*右节点的左子树不为空,则沿着左子树下降,直到到达叶子节点,例如删除下图的节点30
实现代码:
node.h
myIterator.h(由于篇幅的关系,详见C++数据结构——二叉搜索树迭代器的实现)
BSTree.h
#ifndef BS_Tree_H
#define BS_Tree_H
#include"node.h"
#include<iostream>
#include<queue>
using namespace std;
template<typename T>
class bs_Tree
{
friend class myIterator;
private:
node<T> *root; //二叉搜索树根节点
//以后序遍历方式复制二叉搜索树,返回根节点
node<T> * copyBSTree(node<T> *root)
{
node<T> *p=nullptr; //根节点
node<T> *l=nullptr; //左子树
node<T> *r=nullptr; //右子树
if(!root) //递归结束条件
{
return nullptr;
}
else
{
l=copyBSTree(root->left); //递归复制左子树
r=copyBSTree(root->right); //递归复制右子树
p=new node<T>(root->val,nullptr,l,r);
if(l)
{
l->parent=p;
}
if(r)
{
r->parent=p;
}
}
return p;
}
//以后序遍历方式删除二叉搜索树,
void deleteBSTree(node<T>* root)
{
if(!root) //递归结束条件
{
return;
}
else
{