写法一:结构体形式
#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 ;
}
运行结果如下: