如何用類實現二叉樹的創建,遍歷。該類的私密成員為樹的根節點。
#include<iostream.h>
struct tree
{
int data;
tree *left,*right;
};
class Btree
{
static int n;
static int m;
public:
tree *root;
Btree()
{
root=NULL;
}
void create_Btree(int);
void Preorder(tree *); //先序遍歷
void inorder(tree *); //中序遍歷
void Postorder(tree *); //後序遍歷
void display1() {Preorder(root); cout<<endl;}
void display2() {inorder(root);cout<<endl;}
void display3() {Postorder(root); cout<<endl;}
int count(tree *); //計算二叉樹的個數
int findleaf(tree *); //求二叉樹葉子的個數
int findnode(tree *); //求二叉樹中度數為1的結點數量,這是當初考數據結構時候的最後一道題目
};
int Btree::n=0;
int Btree::m=0;
void Btree::create_Btree(int x)
{
tree *newnode=new tree;
newnode->data=x;
newnode->right=newnode->left=NULL;
if(root==NULL)
root=newnode;
else
{
tree *back;
tree *current=root;
while(current!=NULL)
{
back=current;
if(current->data>x)
current=current->left;
else
current=current->right;
}
if(back->data>x)
back->left=newnode;
else
back->right=newnode;
}
}
int Btree::count(tree *p)
{
if(p==NULL)
return 0;
else
return count(p->left)+count(p->right)+1; //這是運用了函數嵌套即遞歸的方法。
}
void Btree::Preorder(tree *temp) //這是先序遍歷二叉樹,采用了遞歸的方法。
{
if(temp!=NULL)
{
cout<<temp->data<<" ";
Preorder(temp->left);
Preorder(temp->right);
}
}
void Btree::inorder(tree *temp) //這是中序遍歷二叉樹,采用了遞歸的方法。
{
if(temp!=NULL)
{
inorder(temp->left);
cout<<temp->data<<" ";
inorder(temp->right);
}
}
void Btree::Postorder(tree *temp) //這是後序遍歷二叉樹,采用了遞歸的方法。
{
if(temp!=NULL)
{
Postorder(temp->left);
Postorder(temp->right);
cout<<temp->data<<" ";
}
}
int Btree::findleaf(tree *temp)
{
if(temp==NULL)return 0;
else
{
if(temp->left==NULL&&temp->right==NULL)return n+=1;
else
{
findleaf(temp->left);
findleaf(temp->right);
}
return n;
}
}
int Btree::findnode(tree *temp)
{
if(temp==NULL)return 0;
else
{
if(temp->left!=NULL&&temp->right!=NULL)
{
findnode(temp->left);
findnode(temp->right);
}
if(temp->left!=NULL&&temp->right==NULL)
{
m+=1;
findnode(temp->left);
}
if(temp->left==NULL&&temp->right!=NULL)
{
m+=1;
findnode(temp->right);
}
}
return m;
}
void main()
{
Btree A;
int array[]={7,4,2,3,15,35,6,45,55,20,1,14,56,57,58};
int k;
k=sizeof(array)/sizeof(array[0]);
cout<<"建立排序二叉樹順序: "<<endl;
for(int i=0;i<k;i++)
{
cout<<array[i]<<" ";
A.create_Btree(array[i]);
}
cout<<endl;
cout<<"二叉樹節點個數: "<<A.count(A.root)<<endl;
cout<<"二叉樹葉子個數:"<<A.findleaf(A.root)<<endl;
cout<<"二叉樹中度數為1的結點的數量為:"<<A.findnode(A.root)<<endl;
cout<<endl<<"先序遍歷序列: "<<endl;
A.display1();
cout<<endl<<"中序遍歷序列: "<<endl;
A.display2();
cout<<endl<<"後序遍歷序列: "<<endl;
A.display3();
}