#include "iostream.h"
#include "stdlib.h"
#include "stack.h"
#pragma once
template<class T>
class CBiTree{
public:
CBiTree(void) { }
~CBiTree(void) { }
static struct _tagBiTNode {
T data;
struct _tagBiTNode* lchild;
struct _tagBiTNode* rchild;
};
private:
typedef _tagBiTNode BiTNode,*BiTree;
public:
bool CreateBiTree(BiTree& t);
bool PreOrderTraverse(BiTree t,void (*visit)(T data));
bool PreOrderTraverseEx(BiTree t,void (*visit)(T data));
bool InOrderTraverse(BiTree t,void (*visit)(T data));
bool InOrderTraverseEx(BiTree t,void (*visit)(T data));
bool PostOrderTraverse(BiTree t,void (*visit)(T data));
bool PostOrderTraverseEx(BiTree t,void (*visit)(T data));
void CountLeaf(BiTree t,int& count);
int BiTreeDepth(BiTree t); //二叉排序樹的操作
void CreateSortBiTree(BiTree &root,T* a,int n);
void InsertNode(BiTree &root,T e);
bool DeleteNode(BiTree &t,T& e);
bool SearchNode(BiTree t,T key,BiTree f,BiTree& p);
private:
void deleteNode(BiTree& p);
};
//創建一個無序二叉樹
template<typename T>
bool CBiTree<T>::CreateBiTree(BiTree& t){
int n;
cin>>n;
if(n==0)
t=NULL;
else {
if(!(t = new BiTNode))
return false;
t->data = n;
CreateBiTree(t->lchild);
CreateBiTree(t->rchild);
}
return true;
}
//先根遍歷 遞歸表示
template<typename T>
bool CBiTree<T>::PreOrderTraverse(BiTree t,void (*visit)(T data)){
if(t!=NULL) {
visit(t->data);
PreOrderTraverse(t->lchild,visit);
PreOrderTraverse(t->rchild,visit);
}
return false;
}
//先根遍歷,棧表示
template<typename T>
bool CBiTree<T>::PreOrderTraverseEx(BiTree t,void (*visit)(T data)){
try {
CStack<BiTree>::_tagStack s; //棧
CStack<BiTree> stack ;
//if(stack == NULL) // return false;
BiTree p = new BiTNode;
if(p == NULL)
return false;
stack.InitStack(s);
p = t;
while(p||!stack.StackEmpty(s)) {
if(p){
visit(p->data);
stack.Push(s,p);
p = p->lchild;
}
else{
stack.Pop(s,p);
p = p->rchild;
}
}
stack.DestroyStack(s);
return true;
} catch(
) {
visit(-1);
return false;
}
}
//中序遍歷,遞歸算法
template<typename T>
bool CBiTree<T>::InOrderTraverse(BiTree t,void (*visit)(T data)){
if(t != NULL) {
InOrderTraverse(t->lchild,visit);
visit(t->data);
InOrderTraverse(t->rchild,visit);
}
return true;
}
//中序遍歷,棧表示
template<typename T>
bool CBiTree<T>::InOrderTraverseEx(BiTree t,void (*visit)(T data)){
try {
CStack<BiTree>::_tagStack s;
CStack<BiTree> stack;
BiTree p = new BiTNode;
p = t;
stack.InitStack(s);
while(p||!stack.StackEmpty(s)) {
if(p){
stack.Push(s,p);
p = p->lchild;
}
else{
stack.Pop(s,p);
visit(p->data);
p = p->rchild;
}
}
stack.DestroyStack(s);
return true;
} catch(
) {
visit(-1);
return false;
}
}
//后序遍歷,遞歸算法
template<class T>
bool CBiTree<T>::PostOrderTraverse(BiTree t,void (*visit)(T data)){
if(t != NULL) {
PreOrderTraverse(t->lchild,visit);
PreOrderTraverse(t->rchild,visit);
visit(t->data);
}
return true;
}
//后序遍歷,棧表示
template<class T>
bool CBiTree<T>::PostOrderTraverseEx(BiTree t,void (*visit)(T data)){
try {
CStack<BiTree>::_tagStack s;
CStack<BiTree> stack;
BiTree p = new BiTNode;
p = t;
stack.InitStack(s);
while(p||!stack.StackEmpty(s)) {
if(p){
stack.Push(s,p->lchild);
p = p ->lchild;
}
else{
visit(p->data);
stack.Pop(s,p);
p = p->rchild;
visit(p->data);
}
}
return true;
} catch(
) {
visit(-1);
return false;
}
}
//計數樹葉的個數
template<class T>
void CBiTree<T>::CountLeaf(BiTree t,int& count){
if(t != NULL) {
CountLeaf(t->lchild,count);
CountLeaf(t->rchild,count); //檢查結點t是否為葉子結點,若是,則定量count++
if(t->lchild == NULL &&t->rchild ==NULL)
count++;
}
}
//樹的深度
template<class T>
int CBiTree<T>::BiTreeDepth(BiTree t){
int dep;
int depleft;
int deprigth ;
if( t==NULL)
dep = -1;
if( t != NULL ) {
depleft = BiTreeDepth(t->lchild);
deprigth = BiTreeDepth(t->rchild);
dep = 1 + ( depleft>deprigth? depleft:deprigth);
}
return dep;
}
//
template<class T>
bool CBiTree<T>::SearchNode(BiTree t,T key,BiTree f,BiTree& p){
if(t == NULL){
p = f;
return false;
}
else if(key == t->data) {
p = t;
return true;
}
else if(key < t->data) {
SearchNode(t->lchild,key,t,p);
}
else
SearchNode(t->rchild,key,t,p);
}
template<class T>
void CBiTree<T>::InsertNode(BiTree &root,T e){
BiTree t = root;
BiTree p = NULL;
BiTree newNode = new BiTNode;
while(t) {
p = t;
if(e <=t->data)
t = t->lchild;
else
t = t->rchild;
}
newNode->data = e;
newNode->lchild = newNode->rchild =NULL;
if(p==NULL)
root = newNode;
else
if(e <p->data)
p->lchild = newNode;
else
p->rchild = newNode;
}
//找到要刪除的結點,刪除結點
template<class T>
void CBiTree<T>::deleteNode(BiTree& p){
BiTree q;
BiTree s;
if(!p->lchild) {
q = p;
p = p->rchild;
free(q);
}
else if(!p->rchild) {
q = p;
p = p->lchild;
free(q);
}
else {
q = p;
s = p->lchild;
while(s->rchild){
q = s;
s = s->rchild;
}
p->data = s->data;
if(q!=p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
}
}
//查找要刪除的結點,并刪除
template<class T>
bool CBiTree<T>::DeleteNode(BiTree &t,T& e){
if(!t)
return false;
else {
if(e == t->data)
deleteNode(t);
else
if(e < t->data)
DeleteNode(t->lchild,e);
else
DeleteNode(t->rchild,e);
return true;
}
}// n 為數據的總長度 用n = sizeof(a) / sizeof(a[0]);
template<class T>
void CBiTree<T>::CreateSortBiTree(BiTree &root,T* a,int n){
for(int i=0;i<n;i++) {
InsertNode(root,a[i]);
}
}
/**************************************************************test**************************************************************/
void print(int data){
if(data == -1)
cout<<"\nError"<<endl;
cout<<data<<"\t";
}
int _tmain(int argc, _TCHAR* argv[]){
cout<<"\nBiTree:-----------------------\n";
CBiTree<int>::_tagBiTNode *p1= NULL;
CBiTree<int>* tree = new CBiTree<int>;
cout<<"\n樹的深度為:"<<tree->BiTreeDepth(t)<<endl;
int n=0;
int a[]={8,6,9,10,23,2,3,0,4,0,5};
tree->CreateSortBiTree(p1,a,sizeof(a)/sizeof(a[0]));
cout<<"\n前序遍歷\n";
tree->PreOrderTraverse(p1,&print);
cout<<"\n";
tree->PreOrderTraverseEx(p1,&print);
cout<<"\n中序遍歷\n"<<endl;
tree->InOrderTraverse(p1,&print);
cout<<"\n";
tree->InOrderTraverseEx(p1,&print);
tree->CountLeaf(p1,n);
cout<<"\n樹的深度為:"<<tree->BiTreeDepth(p1)<<endl;
cout<<"葉子:"<<n<<endl;
cout<<"查找"<<endl;
int k0=3;
if(tree->SearchNode(p1,3,NULL,t)) {
cout<<"找到了"<<endl;
tree->DeleteNode(p1,k0);
tree->InOrderTraverse(p1,&print);
}else
cout<<"沒找到"<<endl;
}
#include "stdlib.h"
#include "stack.h"
#pragma once
template<class T>
class CBiTree{
public:
CBiTree(void) { }
~CBiTree(void) { }
static struct _tagBiTNode {
T data;
struct _tagBiTNode* lchild;
struct _tagBiTNode* rchild;
};
private:
typedef _tagBiTNode BiTNode,*BiTree;
public:
bool CreateBiTree(BiTree& t);
bool PreOrderTraverse(BiTree t,void (*visit)(T data));
bool PreOrderTraverseEx(BiTree t,void (*visit)(T data));
bool InOrderTraverse(BiTree t,void (*visit)(T data));
bool InOrderTraverseEx(BiTree t,void (*visit)(T data));
bool PostOrderTraverse(BiTree t,void (*visit)(T data));
bool PostOrderTraverseEx(BiTree t,void (*visit)(T data));
void CountLeaf(BiTree t,int& count);
int BiTreeDepth(BiTree t); //二叉排序樹的操作
void CreateSortBiTree(BiTree &root,T* a,int n);
void InsertNode(BiTree &root,T e);
bool DeleteNode(BiTree &t,T& e);
bool SearchNode(BiTree t,T key,BiTree f,BiTree& p);
private:
void deleteNode(BiTree& p);
};
//創建一個無序二叉樹
template<typename T>
bool CBiTree<T>::CreateBiTree(BiTree& t){
int n;
cin>>n;
if(n==0)
t=NULL;
else {
if(!(t = new BiTNode))
return false;
t->data = n;
CreateBiTree(t->lchild);
CreateBiTree(t->rchild);
}
return true;
}
//先根遍歷 遞歸表示
template<typename T>
bool CBiTree<T>::PreOrderTraverse(BiTree t,void (*visit)(T data)){
if(t!=NULL) {
visit(t->data);
PreOrderTraverse(t->lchild,visit);
PreOrderTraverse(t->rchild,visit);
}
return false;
}
//先根遍歷,棧表示
template<typename T>
bool CBiTree<T>::PreOrderTraverseEx(BiTree t,void (*visit)(T data)){
try {
CStack<BiTree>::_tagStack s; //棧
CStack<BiTree> stack ;
//if(stack == NULL) // return false;
BiTree p = new BiTNode;
if(p == NULL)
return false;
stack.InitStack(s);
p = t;
while(p||!stack.StackEmpty(s)) {
if(p){
visit(p->data);
stack.Push(s,p);
p = p->lchild;
}
else{
stack.Pop(s,p);
p = p->rchild;
}
}
stack.DestroyStack(s);
return true;
} catch(

visit(-1);
return false;
}
}
//中序遍歷,遞歸算法
template<typename T>
bool CBiTree<T>::InOrderTraverse(BiTree t,void (*visit)(T data)){
if(t != NULL) {
InOrderTraverse(t->lchild,visit);
visit(t->data);
InOrderTraverse(t->rchild,visit);
}
return true;
}
//中序遍歷,棧表示
template<typename T>
bool CBiTree<T>::InOrderTraverseEx(BiTree t,void (*visit)(T data)){
try {
CStack<BiTree>::_tagStack s;
CStack<BiTree> stack;
BiTree p = new BiTNode;
p = t;
stack.InitStack(s);
while(p||!stack.StackEmpty(s)) {
if(p){
stack.Push(s,p);
p = p->lchild;
}
else{
stack.Pop(s,p);
visit(p->data);
p = p->rchild;
}
}
stack.DestroyStack(s);
return true;
} catch(

visit(-1);
return false;
}
}
//后序遍歷,遞歸算法
template<class T>
bool CBiTree<T>::PostOrderTraverse(BiTree t,void (*visit)(T data)){
if(t != NULL) {
PreOrderTraverse(t->lchild,visit);
PreOrderTraverse(t->rchild,visit);
visit(t->data);
}
return true;
}
//后序遍歷,棧表示
template<class T>
bool CBiTree<T>::PostOrderTraverseEx(BiTree t,void (*visit)(T data)){
try {
CStack<BiTree>::_tagStack s;
CStack<BiTree> stack;
BiTree p = new BiTNode;
p = t;
stack.InitStack(s);
while(p||!stack.StackEmpty(s)) {
if(p){
stack.Push(s,p->lchild);
p = p ->lchild;
}
else{
visit(p->data);
stack.Pop(s,p);
p = p->rchild;
visit(p->data);
}
}
return true;
} catch(

visit(-1);
return false;
}
}
//計數樹葉的個數
template<class T>
void CBiTree<T>::CountLeaf(BiTree t,int& count){
if(t != NULL) {
CountLeaf(t->lchild,count);
CountLeaf(t->rchild,count); //檢查結點t是否為葉子結點,若是,則定量count++
if(t->lchild == NULL &&t->rchild ==NULL)
count++;
}
}
//樹的深度
template<class T>
int CBiTree<T>::BiTreeDepth(BiTree t){
int dep;
int depleft;
int deprigth ;
if( t==NULL)
dep = -1;
if( t != NULL ) {
depleft = BiTreeDepth(t->lchild);
deprigth = BiTreeDepth(t->rchild);
dep = 1 + ( depleft>deprigth? depleft:deprigth);
}
return dep;
}
//
template<class T>
bool CBiTree<T>::SearchNode(BiTree t,T key,BiTree f,BiTree& p){
if(t == NULL){
p = f;
return false;
}
else if(key == t->data) {
p = t;
return true;
}
else if(key < t->data) {
SearchNode(t->lchild,key,t,p);
}
else
SearchNode(t->rchild,key,t,p);
}
template<class T>
void CBiTree<T>::InsertNode(BiTree &root,T e){
BiTree t = root;
BiTree p = NULL;
BiTree newNode = new BiTNode;
while(t) {
p = t;
if(e <=t->data)
t = t->lchild;
else
t = t->rchild;
}
newNode->data = e;
newNode->lchild = newNode->rchild =NULL;
if(p==NULL)
root = newNode;
else
if(e <p->data)
p->lchild = newNode;
else
p->rchild = newNode;
}
//找到要刪除的結點,刪除結點
template<class T>
void CBiTree<T>::deleteNode(BiTree& p){
BiTree q;
BiTree s;
if(!p->lchild) {
q = p;
p = p->rchild;
free(q);
}
else if(!p->rchild) {
q = p;
p = p->lchild;
free(q);
}
else {
q = p;
s = p->lchild;
while(s->rchild){
q = s;
s = s->rchild;
}
p->data = s->data;
if(q!=p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
}
}
//查找要刪除的結點,并刪除
template<class T>
bool CBiTree<T>::DeleteNode(BiTree &t,T& e){
if(!t)
return false;
else {
if(e == t->data)
deleteNode(t);
else
if(e < t->data)
DeleteNode(t->lchild,e);
else
DeleteNode(t->rchild,e);
return true;
}
}// n 為數據的總長度 用n = sizeof(a) / sizeof(a[0]);
template<class T>
void CBiTree<T>::CreateSortBiTree(BiTree &root,T* a,int n){
for(int i=0;i<n;i++) {
InsertNode(root,a[i]);
}
}
/**************************************************************test**************************************************************/
void print(int data){
if(data == -1)
cout<<"\nError"<<endl;
cout<<data<<"\t";
}
int _tmain(int argc, _TCHAR* argv[]){
cout<<"\nBiTree:-----------------------\n";
CBiTree<int>::_tagBiTNode *p1= NULL;
CBiTree<int>* tree = new CBiTree<int>;
cout<<"\n樹的深度為:"<<tree->BiTreeDepth(t)<<endl;
int n=0;
int a[]={8,6,9,10,23,2,3,0,4,0,5};
tree->CreateSortBiTree(p1,a,sizeof(a)/sizeof(a[0]));
cout<<"\n前序遍歷\n";
tree->PreOrderTraverse(p1,&print);
cout<<"\n";
tree->PreOrderTraverseEx(p1,&print);
cout<<"\n中序遍歷\n"<<endl;
tree->InOrderTraverse(p1,&print);
cout<<"\n";
tree->InOrderTraverseEx(p1,&print);
tree->CountLeaf(p1,n);
cout<<"\n樹的深度為:"<<tree->BiTreeDepth(p1)<<endl;
cout<<"葉子:"<<n<<endl;
cout<<"查找"<<endl;
int k0=3;
if(tree->SearchNode(p1,3,NULL,t)) {
cout<<"找到了"<<endl;
tree->DeleteNode(p1,k0);
tree->InOrderTraverse(p1,&print);
}else
cout<<"沒找到"<<endl;
}