C++ 二叉樹創建、遍歷訪問、刪除

代碼包含:二叉樹數組創建(前序)、前序、中序、後序遍歷、節點訪問、刪除

代碼說明:該代碼使用模板建立,一些地方並未完善,比如array[index]==-1,僅僅使用於數字類型,如果二叉樹存儲的是char或string,需在這之前判斷類型,給予特定的空標識,對於節點的訪問,使用一個函數指針傳遞對節點的操作,刪除只能使用後序遍歷的方式

#include<iostream>
using namespace std;

template <typename T>
struct Node{
T data;
Node<T>* left;
Node<T>* right;
};


template <typename T>
void Create(Node<T>*& node,T array[],int& index,int& length){
if(index>=length||array[index]==-1){
node=0;
}
else{
node=new Node<T>();
node->data=array[index];
Create(node->left,array,++index,length);
Create(node->right,array,++index,length);
}
}

template <typename T>
void PreOrderTraversal(Node<T>*& node,void(*func)(Node<T>*& arg)){
if(node!=0){
if(func!=0){
func(node);
}
PreOrderTraversal(node->left,func);
PreOrderTraversal(node->right,func);
}
}


template <typename T>
void InOrderTraversal(Node<T>*& node,void(*func)(Node<T>*& arg)){
if(node!=0){
InOrderTraversal(node->left,func);
if(func!=0){
func(node);
}
InOrderTraversal(node->right,func);
}
}

template <typename T>
void PostOrderTraversal(Node<T>*& node,void(*func)(Node<T>*& arg)){
if(node!=0){
PostOrderTraversal(node->left,func);
PostOrderTraversal(node->right,func);
if(func!=0){
func(node);
}
}
}


template <typename T>
void Delete(Node<T>*& node){
delete node;
}

template <typename T>
void Show(Node<T>*& node){
cout<<node->data<<endl;
}
/*
1
2 5
3 4 6
*/

int main(){
void(*Delegate)(Node<int>*& arg);
Delegate=0;
int array[]={
1,2,3,-1,-1,4,-1,-1,5,6,-1,-1,-1
};

Node<int>* tree;
int index=0;
int length=sizeof(array)/sizeof(array[0]);
Create(tree,array,index,length);

Delegate=Show;
InOrderTraversal(tree,Delegate);


Delegate=Delete;
PostOrderTraversal(tree,Delegate);
return 0;
}

發佈了95 篇原創文章 · 獲贊 20 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章