二叉排序树

二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树

 (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

             --如果有两个相等的元素, 可根据情况 自定义位置。。!

            实现了, 二叉排序树的 构造(递归和 非递归)、查找、插入。

  
//#include "SortedTree.h"
#include <iostream>
using namespace std;


struct Node
{
	int data;	
	Node *left;
	Node *right;

	Node():data(-1),left(NULL),right(NULL){}
	Node(int num):data(num),left(NULL),right(NULL){}

};

class BinarySortTree
{
public: 
	BinarySortTree(int num[], int len);
	void InsertNode_Loop(int num);	   //非递归插入
	void InsertNode(int num);         //递归插入

	void PrintTree();			       //打印树	
	Node* Search(int num);			   //查找节点

private:
	void InsertNode(Node *curNode, int num);  //递归插入
	void PrintTree(Node *curNode);				//打印树, 后根遍历二叉排序树	

	Node *Search(Node *curNode, int num);						//查找节点

	Node  *rootNode;

};

BinarySortTree::BinarySortTree(int a[],int len):rootNode(NULL)
{
	for (int i = 0; i<len; i++)
	{
		//InsertNode_Loop(a[i]);      //非递归
		InsertNode(a[i]);			  //递归	
	}	
}

void BinarySortTree::InsertNode_Loop(int num)
{
	//若根节点为空,则用第一个节点 作为根节点。
	if (rootNode == NULL)
	{
		rootNode = new Node(num);
		return;
	}
	Node * pRootNode = rootNode; 
	Node *pNode = new Node(num);
	//待插入的节点 小于根节点则 插入到 左子树
	while(pRootNode != NULL)
	{
		if (num < pRootNode->data)
		{
			if (pRootNode->left == NULL)
			{
				pRootNode->left = pNode;				
				return;
			}else
			{
				pRootNode = pRootNode->left;
			}

		}else
		{
			if (pRootNode->right == NULL)
			{
				pRootNode->right = pNode;				
				return;
			}else
			{
				pRootNode = pRootNode->right;
			}		 
		} 
	}   

	return;
}

void BinarySortTree::InsertNode(int num)
{
	if (rootNode == NULL)
	{
		rootNode = new Node(num);
		return;
	}

	InsertNode(rootNode, num); 

	return;
}

void BinarySortTree::InsertNode(Node *curNode,int num)
{
	// 不要使用注释部分的代码,因为在c\c++ 中形参 只是‘值’ 传递!
	/*  if (curNode == NULL)
	{
	Node *pNode = new Node(num);
	curNode = pNode;
	return;
	}

	if (num < curNode->data)
	{
	InsertNode(curNode->left, num);
	}else
	{
	InsertNode(curNode->right, num);
	}
	*/
	if (num < curNode->data)
	{
		if (curNode->left == NULL)
		{
			curNode->left =  new Node(num);
		}else

		{
			InsertNode(curNode->left, num);
		}

	}else if (num > curNode->data)
	{
		if (curNode->right == NULL)
		{
			curNode->right = new Node(num);
		}else
		{
			InsertNode(curNode->right, num);
		}
	}    

	return;
}


Node* BinarySortTree::Search(int num)
{
	if (rootNode->data == num)
	{
		cout<<"查找成功..."<<num<<endl;
		return rootNode;
	}else if (num < rootNode->data)
	{
		return Search(rootNode->left, num);
	}else
	{
		return Search(rootNode->right, num);
	}

	return NULL;
}

Node* BinarySortTree::Search(Node *curNode ,int num)
{
	if (curNode == NULL)
	{
		cout<<"查找失败..."<<num<<endl;
		return NULL;
	}else
	{
		if (curNode->data == num)
		{
			cout<<"查找成功..."<<num<<endl;
			return curNode;
		}else if (num < curNode->data)
		{
			Search(curNode->left, num);
		}else
		{
			Search(curNode->right, num);
		} 
	}
	return NULL;
}


void BinarySortTree::PrintTree()
{	
	if(rootNode !=NULL)
	{
		cout<<"打印树。。。"<<endl;
		PrintTree(rootNode);
	}
}

void BinarySortTree::PrintTree(Node* curNode)
{
	if (curNode == NULL)
	{
		return;
	}	
	PrintTree(curNode->left);
	PrintTree(curNode->right);
	cout<<curNode->data<<endl;	
}

int main()
{
	int a[] = {5,2,1,4,0,9,7,10,100};
	BinarySortTree tree(a, sizeof(a)/sizeof(a[0]));

	tree.PrintTree();
	tree.Search(19);   

	return 0;
}

(后根)遍历结果:

    0 1 4 2 7 100 10 9 5


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值