二叉搜索树的c++实现

#include<iostream>
using namespace std;

template<class T>
class BSTree;

template <class T>
class BSTNode
{
	friend class BSTree<T>;
public:
	BSTNode():leftChild(NULL),rightChild(NULL)
	{
	}
	BSTNode(T d, BSTNode<T>* L=NULL, BSTNode<T>* R=NULL):data(d),leftChild(L),rightChild(R)
	{}
	BSTNode(BSTNode<T>* L=NULL, BSTNode<T>* R=NULL):data(T()),leftChild(L),rightChild(R)
	{}
	~BSTNode()
	{}
private:
	BSTNode<T>* leftChild;
	BSTNode<T>* rightChild;
	T           data;

};

template<class T>
class BSTree
{
public:
	BSTree():root(NULL):RefValue(0)
	{
	}
	BSTree(T value)
	{
		T x;
		root = NULL;
		Refvalue = value;
		cin>>x;
		while(x != Refvalue)
		{
			Insert(root,x);
			cin>>x;
		}
	}

	~BSTree()
	{}
public:
	void PrintTree()const
	{
		PrintTree(root);

	}
	bool Search(const T x)
	{
		return (Search(root, x)!=NULL) ? true : false;
	}
	void Insert(const T& x)
	{
		Insert(root, x);
	}
	void MakeEmpty()
	{
		MakeEmpty(root);
		root = NULL;
	}
	bool Remove(const T x)
	{
		return Remove(root,x);
	}
	T Max()const
	{
		 return Max(root)->data;
	}
	T Min()const
	{
		return Min(root)->data;
	}
	size_t getSize()
	{
		return getSize(root);
	}
	void copy(BSTree<T> & p)
	{
		copy(root, p.root);
	}
protected:
	void copy(BSTNode<T>* &t, BSTNode<T>* &p)  //用p给t拷贝
	{

		if(p != NULL)
		{
			if(t !=	NULL)  //t节点存在,直接赋值
				t->data = p->data;
			else  //t为空,开辟p->data大小的节点
				t = new BSTNode<T>(p->data);
		    copy(t->leftChild,p->leftChild);

			copy(t->rightChild, p->rightChild);
		}
		else
		{
			if(t != NULL)  //拷贝完了t还不空,把t节点后的制空
			{
				MakeEmpty(t);
				t = NULL;
			}
		}
	}
	size_t getSize(BSTNode<T>* t)const
	{
		if(t != NULL)
			return 1+getSize(t->leftChild)+getSize(t->rightChild);
		else
			return 0;
	}

	BSTNode<T>* Min(BSTNode<T>* t)const
	{
		if(t == NULL)
			return NULL;
		if(t->leftChild != NULL)
			Min(t->leftChild);
		else
			return t;
	}

	BSTNode<T>* Max(BSTNode<T>* t)const
	{
		if(t == NULL)
			return NULL;
		if(t->rightChild != NULL)
			Max(t->rightChild);
		else
			return t;
	}

	bool Remove(BSTNode<T>* & t, const T x)
	{
		BSTNode<T>* q= NULL;
		if(t != NULL)
		{
			if(t->data > x)
				Remove(t->leftChild, x);
			else if(t->data < x)
				Remove(t->rightChild, x);

			else if(t->leftChild != NULL && t->rightChild !=NULL)
			{
				q = t->rightChild;
				while(q->leftChild != NULL)
					q = q->leftChild ;
				t->data = q->data;
				Remove(t->rightChild, t->data);
			}
			else
			{
				q = t;
				if(t->leftChild == NULL)
					t = t->rightChild;
				else
					t = t->leftChild;
				delete q;
				return true;
			}
		}
		return false;
	}
	void MakeEmpty(BSTNode<T>* &t)
	{
 		if(t != NULL)
		{
			MakeEmpty(t->leftChild);
			MakeEmpty(t->rightChild);
			delete t;
		}
	}

	void PrintTree(BSTNode<T>* t)const
	{
		if(t != NULL)
		{
			PrintTree(t->leftChild);
			cout<<t->data<<" ";
			PrintTree(t->rightChild);
		}
	}
	bool Insert(BSTNode<T>* & t, const T& x)
	{
		if(t == NULL)
		{
			t = new BSTNode<T>(x);
			return true;
		}
		else if(t->data > x)
			Insert(t->leftChild, x);
		else if(t->data < x)
			Insert(t->rightChild , x);
		else //插入元素与树中某个节点相等时,不插入
			return false;
	}

	BSTNode<T>* Search(BSTNode<T>* t, const T x)
	{
		if(t != NULL)
		{
			if(t->data > x)
				return Search(t->leftChild, x);
			else if(t->data < x)
				return Search(t->rightChild, x);
			else
				return t;
		}
		return NULL;
	}
private:
	BSTNode<T>* root;
	T           Refvalue;  //结束标志
};

void main()
{
	int a[] = {9,53,5,45,17,23,78,65,34,87};
	BSTree<int> bst;
	for(int i=0; i<10; ++i)
		bst.Insert(a[i]);
	bst.PrintTree();
	cout<<endl;
	bst.Search(10);
//	BSTree<int> bst1(0);
//	bst1.PrintTree();
	cout<<endl;
	//bst.Max();
	cout<<bst.Max()<<endl;
	cout<<bst.Min()<<endl;
//	bst.Remove(78);
//	bst.MakeEmpty();
	bst.PrintTree();
	cout<<endl;
	cout<<bst.getSize()<<endl;
	BSTree<int> bst1;
	bst.copy(bst1);
	bst.PrintTree();
}

递归的使用要理清思路,删除一个节点时要考虑多种情况,指针的使用要明确。

时间: 2024-10-01 02:44:14

二叉搜索树的c++实现的相关文章

用JS实现二叉搜索树

二叉树的节点最多只能有两个子节点,一个左侧子节点,一个右侧子节点. 二叉搜索树(BST),是二叉树的一种,但只允许在左侧节点存储比父节点小的值,在右侧节点存储比父节点大或等于父节点的值. 1.创建BST 1.1创建BST类 首先申明BST类的基本结构 function BinarySearchTree() { var Node = function(key){ this.key = key; this.left = null; this.right = null; }; var root = n

538. Convert BST to Greater Tree 二叉搜索树转换为更大树

Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST. Example: Input: The root of a Binary Search Tree like thi

二叉搜索树

#include<stdio.h> #include<iostream> #include<math.h> #include<stdlib.h> using namespace std; struct TreeNode { TreeNode* p; TreeNode* l; TreeNode* r; int key; TreeNode() { p = 0; l = 0; r = 0; key = -1; } }; const int RANDMOD = 30

04-树4 是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出N个以空格分隔的正整数,作为初始插入序列.最后L行,每行给出N个插入的元素,属于

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

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

剑指offer:二叉搜索树与双向链表

1.题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2.解题思路: (1)将左子树构造成双向链表,并返回链表头节点: (2)定位左子树双链表的尾节点: (3)如果左子树链表不为空,将当前root连缀其链尾: (4)将右子树构造出双向链表,并返回链表头节点: (5)如果右子树链表不为空,将当前root连缀其表头: (6)根据左子树链表是否为空,确定返回的节点. 3.JavaScript实现: function Conv

数据结构——二叉搜索树、B树、B-树

数据结构——二叉搜索树.B树.B-树 1. 综述 二叉排序树(Binary Sort Tree),又叫二叉查找树(Binary Search Tree),也叫二叉排序树. 二叉搜索树满足以下性质: 1. 若根节点左子树不为空,则左子树上的所有节点均小于根节点: 2. 若根节点右子树不为空,则右子树上的所有节点均大于根节点: 3. 其左右子树也是二叉搜索树(递归定义): 4. 没有键值相等的点. B树就是B-树.B树/B-树英文叫B-Tree,可能被不小心翻译成了B-树.

PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数N:第二行给出N个互不相同的正整数,其间以空格分隔. 输出格式: 将输入的N个正整数顺序插入一个初始为空的二叉搜索树.在第一行中输出结果树的层序

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable

二叉搜索树与双向链表

void convertNode(BSTreeNode *root, BSTreeNode ** pLastNodeInList) { if(!root) return ; if(root->left) { convertNode(root->left, pLastNodeInList); } root->left = *pLastNodeInList; if(*pLastNodeInList != NULL) (*pLastNodeInList)->right = root; *