算法导论--二叉查找树--C++实现

26 篇文章 0 订阅

头文件:

#ifndef BSTREE_H
#define BSTREE_H
typedef struct Node{
	int key;
	Node *p;
	Node *left;
	Node *right;
}Node;
class BSTree{
public:
	Node *root;
	BSTree():root(0){}
	Node *minimum(Node *p);
	Node *maximum(Node *p);
	Node *predecessor(Node *p);
	Node *successor(Node *p);
	Node *search(int k);
	void inorder(Node *p);
	void insert(int k);
	void remove(Node *p);
};
#endif
源文件:

#include <iostream>
#include "bstree.h"

Node *BSTree::maximum(Node *p){
	if(p==NULL)return p;
	while(p->right){
		p=p->right;
	}
	return p;
}
Node *BSTree::minimum(Node *p){
	if(p==NULL)return p;
	while(p->left){
		p=p->left;
	}
	return p;
}
Node *BSTree::successor(Node *x){
	if(x==NULL)return x;
	if(x->right)
		return minimum(x->right);
	Node *y=x->p;
	while(y!=NULL&&x==y->right){
		x=y;
		y=y->p;
	}
	return y;
}
Node *BSTree::predecessor(Node *x){
	if(x==NULL)return x;
	if(x->left)
		return maximum(x->left);
	Node *y=x->p;
	while(y!=NULL&&x==y->left){
		x=y;
		y=y->p;
	}
	return y;
}
void BSTree::insert(int k){
	//
	Node *node=new Node;
	node->left=NULL;
	node->right=NULL;
	node->key=k;
	//
	Node *y=NULL;
	Node *x=root;
	while(x){
		y=x;
		if(k<x->key)
			x=x->left;
		else
			x=x->right;
	}
	node->p=y;
	if(y==NULL)
		root=node;
	else if(k<y->key){
		y->left=node;
	}else
		y->right=node;
}
void BSTree::remove(Node *z){
	if(z==NULL)return;
	Node *y,*x;
	//
	if(z->left==NULL||z->right==NULL){
		y=z;
	}else{
		y=successor(z);
	}
	//
	if(y->left)
		x=y->left;
	else
		x=y->right;

	//
	if(x){
		x->p=y->p;
	}
	if(y->p==NULL)
		root=x;
	else if(y==y->p->left)
		y->p->left=x;
	else
		y->p->right=x;
	//
	if(y!=z)
		z->key=y->key;
	delete y;
}

Node *BSTree::search(int k){
	if(root==NULL)return root;
	Node *p=root;
	while(p&&p->key!=k){
		if(k<p->key)
			p=p->left;
		else
			p=p->right;
	}
	return p;
}

void BSTree::inorder(Node *p){
	if(p==NULL)return;
	inorder(p->left);
	std::cout<<p->key<<" ";
	inorder(p->right);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值