1 #include<iostream.h>
  2 struct tree
  3 {
  4     int data;
  5     tree *left,*right;
  6 };
  7 class Btree
  8 {
  9     static int n;
 10     static int m;
 11 public:
 12     tree *root;
 13     Btree()
 14     {
 15         root=NULL;
 16     }
 17     void create_Btree(int);
 18     void Preorder(tree *);                  //先序遍历
 19     void inorder(tree *);                   //中序遍历
 20     void Postorder(tree *);                 //后序遍历
 21     void display1() {Preorder(root); cout<<endl;}
 22     void display2() {inorder(root);cout<<endl;}
 23     void display3() {Postorder(root); cout<<endl;}  
 24     int count(tree *);                      //计算二叉树的个数
 25     int findleaf(tree *);                   //求二叉树叶子的个数
 26     int findnode(tree *);                   //求二叉树中度数为1的结点数量,这是当初考数据结构时候的最后一道题目
 27 };                                          
 28 int Btree::n=0;
 29 int Btree::m=0;
 30 void Btree::create_Btree(int x)
 31 {
 32     tree *newnode=new tree;
 33     newnode->data=x;
 34     newnode->right=newnode->left=NULL;
 35     if(root==NULL)
 36         root=newnode;
 37     else
 38     {
 39         tree *back;
 40         tree *current=root;
 41         while(current!=NULL)
 42         {
 43             back=current;
 44             if(current->data>x)
 45                 current=current->left;
 46             else
 47                 current=current->right;
 48         }
 49         if(back->data>x)
 50             back->left=newnode;
 51         else
 52             back->right=newnode;
 53     }
 54 }
 55 int Btree::count(tree *p)
 56 {
 57     if(p==NULL)
 58         return 0;
 59     else
 60         return count(p->left)+count(p->right)+1;      //这是运用了函数嵌套即递归的方法。
 61 }
 62 void Btree::Preorder(tree *temp)    //这是先序遍历二叉树,采用了递归的方法。
 63 {
 64     if(temp!=NULL)
 65     {
 66         cout<<temp->data<<" ";
 67         Preorder(temp->left);
 68         Preorder(temp->right);
 69     }
 70 }
 71 void Btree::inorder(tree *temp)      //这是中序遍历二叉树,采用了递归的方法。
 72 {
 73     if(temp!=NULL)
 74     {
 75         inorder(temp->left);
 76         cout<<temp->data<<" ";
 77         inorder(temp->right);
 78     }
 79 }
 80 void Btree::Postorder(tree *temp)     //这是后序遍历二叉树,采用了递归的方法。
 81 {
 82     if(temp!=NULL)
 83     {
 84         Postorder(temp->left);
 85         Postorder(temp->right);
 86         cout<<temp->data<<" ";
 87     }
 88 }
 89 int Btree::findleaf(tree *temp)
 90 {
 91     if(temp==NULL)return 0;
 92     else
 93     {
 94         if(temp->left==NULL&&temp->right==NULL)return n+=1;
 95         else
 96         {
 97             findleaf(temp->left);
 98             findleaf(temp->right);
 99         }
100         return n;
101     }
102 }
103 int Btree::findnode(tree *temp)
104 {
105     if(temp==NULL)return 0;
106     else
107     {
108         if(temp->left!=NULL&&temp->right!=NULL)
109         {
110             findnode(temp->left);
111             findnode(temp->right);
112         }
113         if(temp->left!=NULL&&temp->right==NULL)
114         {
115             m+=1;
116             findnode(temp->left);
117         }
118         if(temp->left==NULL&&temp->right!=NULL)
119         {
120             m+=1;
121             findnode(temp->right);
122         }
123     }
124     return m;
125 }
126 
127 
128 void main()
129 {
130     Btree A;
131     int array[]={7,4,2,3,15,35,6,45,55,20,1,14,56,57,58};
132     int k;
133     k=sizeof(array)/sizeof(array[0]);
134     cout<<"建立排序二叉树顺序: "<<endl;
135     for(int i=0;i<k;i++)
136     {
137         cout<<array[i]<<" ";
138         A.create_Btree(array[i]);
139     }
140     cout<<endl;
141     cout<<"二叉树节点个数: "<<A.count(A.root)<<endl;
142     cout<<"二叉树叶子个数:"<<A.findleaf(A.root)<<endl;
143     cout<<"二叉树中度数为1的结点的数量为:"<<A.findnode(A.root)<<endl;
144     cout<<endl<<"先序遍历序列: "<<endl;
145     A.display1();
146     cout<<endl<<"中序遍历序列: "<<endl;
147     A.display2();
148     cout<<endl<<"后序遍历序列: "<<endl;
149     A.display3();
150 }

 

posted on 2012-05-03 09:24  elleniou  阅读(32772)  评论(5编辑  收藏  举报