C++ 二叉排序树的创建与遍历

78 篇文章 1 订阅
写法一:结构体形式
#include<iostream>
using namespace std;

struct BinaryTreeNode{
	int value;
	BinaryTreeNode *m_pLeft;
	BinaryTreeNode *m_pRight;
};

void addBTNode(BinaryTreeNode **myBT,int val);//添加节点,满足每个父亲节点大于左边的,小于右边的 

void preorder_showBT(BinaryTreeNode *myBT);
void midorder_showBT(BinaryTreeNode *myBT);
void lastorder_showBT(BinaryTreeNode *myBT);

int main(){
	
	BinaryTreeNode *myBT = nullptr;
	
	addBTNode(&myBT,10);
	addBTNode(&myBT,2);
	addBTNode(&myBT,3);
	addBTNode(&myBT,15);
	addBTNode(&myBT,18);
	addBTNode(&myBT,1);
	addBTNode(&myBT,16);
	
	preorder_showBT(myBT);
	cout<<endl;
	midorder_showBT(myBT);
	cout<<endl;
	lastorder_showBT(myBT);
	cout<<endl;
	
	return 0;
}


void addBTNode(BinaryTreeNode **myBT,int val){
	if(*myBT == nullptr){
		*myBT = new BinaryTreeNode();
		(*myBT)->value = val;
		(*myBT)->m_pLeft = nullptr;
		(*myBT)->m_pRight = nullptr;
		return;	
	}
		
	if(val == (*myBT)->value){
		return;
	}
	else if(val < (*myBT)->value){
		addBTNode(&(*myBT)->m_pLeft,val);
	}
	else{
		addBTNode(&(*myBT)->m_pRight,val);
	}			
}

void preorder_showBT(BinaryTreeNode *myBT){
	if(myBT == nullptr )
		return;
	cout<<myBT->value<<" ";
	
	preorder_showBT(myBT->m_pLeft);
	preorder_showBT(myBT->m_pRight);
}

void midorder_showBT(BinaryTreeNode *myBT){
	if(myBT == nullptr )
		return;
	
	midorder_showBT(myBT->m_pLeft);
	cout<<myBT->value<<" ";
	midorder_showBT(myBT->m_pRight);
}

void lastorder_showBT(BinaryTreeNode *myBT){
	if(myBT == nullptr )
		return;
	
	lastorder_showBT(myBT->m_pLeft);
	lastorder_showBT(myBT->m_pRight);
	cout<<myBT->value<<" ";
}


写法二:

#include<iostream>
using namespace std;
 
typedef struct BinaryTreeNode{
	int value;
	BinaryTreeNode *m_pLeft;
	BinaryTreeNode *m_pRight;
}BTNode;
 
void addBTNode(BTNode *&myBT,int val);//创建二叉排序树,通过*&来改变指针的值
void createBT(BTNode *&BT,int arr[],int n);
 
void preorder_showBT(BinaryTreeNode *myBT);
void midorder_showBT(BinaryTreeNode *myBT);
void lastorder_showBT(BinaryTreeNode *myBT);
 
int main(){
	
	BTNode *myBT = nullptr;
	
	int arr[10] = {314,426,12,78,143,8,21,14,9,314};
	createBT(myBT,arr,10);
	
	preorder_showBT(myBT);
	cout<<endl;
	midorder_showBT(myBT);
	cout<<endl;
	lastorder_showBT(myBT);
	cout<<endl;
	
	return 0;
}

void createBT(BTNode *&BT,int arr[],int n){
	BT = nullptr;
	for(int i=0;i<n;i++)
		addBTNode(BT,arr[i]);	
}
 


void addBTNode(BTNode *&myBT,int val){
	if(myBT == nullptr){
		myBT = new BinaryTreeNode();
		myBT->value = val;
		myBT->m_pLeft = nullptr;
		myBT->m_pRight = nullptr;
		return;	
	}
		
	if(val == myBT->value){
		return;
	}
	else if(val < myBT->value){
		addBTNode(myBT->m_pLeft,val);
	}
	else{
		addBTNode(myBT->m_pRight,val);
	}			
}

 
void preorder_showBT(BinaryTreeNode *myBT){
	if(myBT == nullptr )
		return;
	cout<<myBT->value<<" ";
	
	preorder_showBT(myBT->m_pLeft);
	preorder_showBT(myBT->m_pRight);
}
 
void midorder_showBT(BinaryTreeNode *myBT){
	if(myBT == nullptr )
		return;
	
	midorder_showBT(myBT->m_pLeft);
	cout<<myBT->value<<" ";
	midorder_showBT(myBT->m_pRight);
}
 
void lastorder_showBT(BinaryTreeNode *myBT){
	if(myBT == nullptr )
		return;
	
	lastorder_showBT(myBT->m_pLeft);
	lastorder_showBT(myBT->m_pRight);
	cout<<myBT->value<<" ";
}

写法三:类的形式

注意:因为是模版类,所以在类外写函数方法时,类名一定要加<typename>

#include<iostream>
using namespace std;
 
template <typename keyType>
class BinaryTreeNode{
public:
	keyType value;
	BinaryTreeNode *m_pLeft;
	BinaryTreeNode *m_pRight;
	BinaryTreeNode(keyType v):value(v),m_pLeft(nullptr),m_pRight(nullptr){}
};


template <typename keyType>
class BT{
	typedef BinaryTreeNode<keyType> BTNode;//给结点定义别名 
public:
	void insertBTNode(BTNode *&root,keyType val);
	void createBT(keyType arr[],int n);//创建二叉排序树,通过*&来改变指针的值
 
	void preorder_showBT();//前序遍历 
	void preorder_showBT_core(const BTNode *root); 
	
	~BT();//析构函数 
	void release_BT_core(BTNode *root);
	BTNode *root;	
};


 
int main(){
	
	BT<float> bt;
	
	float arr[10] = {314.89,426.34,12,78,143,8.8,21,14,9.345,314};
	bt.createBT(arr,10);//构建二叉排序树 
	
	bt.preorder_showBT();//前序遍历打印 
	cout<<endl;
	
	return 0;
}


template <typename keyType>
void BT<keyType>::createBT(keyType arr[],int n){
	root = nullptr;
	for(int i=0;i<n;i++)
		insertBTNode(root,arr[i]);	
}


template <typename keyType>
void BT<keyType>::insertBTNode(BTNode *&root,keyType val){
	if(root == nullptr){
		root = new BTNode(val);
		return;	
	}
		
	if(val == root->value){
		return;
	}
	else if(val < root->value){
		insertBTNode(root->m_pLeft,val);
	}
	else{
		insertBTNode(root->m_pRight,val);
	}			
}


template <typename keyType>
void BT<keyType>::preorder_showBT(){
	preorder_showBT_core(root);
}


template <typename keyType>
void BT<keyType>::preorder_showBT_core(const BTNode *root){
	if(root == nullptr){
		return;
	}
		
	cout<<root->value<<" ";
	preorder_showBT_core(root->m_pLeft);
	preorder_showBT_core(root->m_pRight);
}


template <typename keyType>
BT<keyType>::~BT()//释放二叉树 
{
	release_BT_core(root);
}


template <typename keyType>
void BT<keyType>::release_BT_core(BTNode *root)//释放二叉树 
{
	if(root == nullptr)
		return;
	release_BT_core(root->m_pLeft);
	release_BT_core(root->m_pRight);
	delete root;
	root = nullptr;
	return ;
}
 

运行结果如下:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值