二叉树基本操作实现

 

  
  
  
  
  1. // BiTree_02.cpp : Defines the entry point for the console application.  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5.  
  6.  
  7. /****************************************************************************/ 
  8. /*  1、问题描述:很多涉及二叉树的操作的算法都是以二叉树的遍历操作为基础的。*/ 
  9. /*  编写程序,对一棵给定的二叉树进行先、中、后三种次序的遍历。              */ 
  10. /*  2、基本要求:以二叉链表为存储结构,实现二叉树的先、中、后三种次序的递  */ 
  11. /*  归和非递归遍历。                                                        */ 
  12. /*  3、测试数据:以教科书图6.9的二叉树为例。                               */ 
  13. /*  4、实现提示:                                                          */ 
  14. /*    (1)、设二叉树的结点不超过30个,且每个结点的数据均为字符,这样可  */ 
  15. /*  利用先序遍历序列作为输入顺序创建二叉树链表存储结构。                    */ 
  16. /*    (2)、也可利用完全二叉树在顺序存储中的特性,创建二叉树的存储结构,*/ 
  17. /*  此时,二叉树中结点数据的类型不受限制。                                  */ 
  18. /*  5、选作内容:                                                          */ 
  19. /*    (1)、借助队列,实现二叉树的层序遍历。                            */ 
  20. /*    (2)、按凹入表或树形打印所遍历的二叉树。                          */ 
  21. /****************************************************************************/ 
  22. #include<iostream>  
  23. #include<fstream>  
  24. #include<string>  
  25. #include<stack>  
  26. #include<stdlib.h>  
  27. //#include<stdio.h>  
  28. //#include<malloc.h>  
  29. using namespace std;  
  30. //--------------------------------------------------  
  31. #define OK 1  
  32. #define ERROR 0  
  33. #define OVERFLOW -2  
  34. typedef char TElemtype;  
  35. const int MaxLength = 30;//二叉树的结点不超过30个  
  36. typedef struct BiTNode{//二叉树结点结构  
  37.     TElemtype data;  
  38.     struct BiTNode *lchild,*rchild;  
  39. }BiTNode,*BiTree;  
  40. //--------------------------------------------------  
  41. class BinaryTree{  
  42. private:  
  43.      BiTree T;  
  44. public:  
  45.      int CreateBiTree(BiTree &T,ifstream &in);  
  46.      //递归遍历  
  47.      void PreOrder(BiTree &T);  
  48.      void InOrder(BiTree &T);  
  49.      void PostOrder(BiTree &T);  
  50.      //层序遍历  
  51.      void LevelOrder(BiTree T);  
  52.      //非递归遍历  
  53.      void RePreOrder(BiTree &T);  
  54.      void ReInOrder(BiTree &T);  
  55.      void RePostOrder(BiTree &T);  
  56.  
  57.      bool Complete(BiTree T);  
  58.      int Depth(BiTree T);  
  59.      int Countleaf(BiTree T);  
  60.      int Countleafs(BiTree T);  
  61. };//BinaryTree  
  62. //--------------------------------------------------  
  63. void main(){  
  64.     ofstream out("data.txt");  
  65. /*  if(out){  
  66.         for(char i = 65; i < 70; i++)  
  67.             out << i;// << '#' << char(i + 7);  
  68.         out << "###############";  
  69.     }  
  70. */ 
  71. //  out << "AB##C##";  
  72. //  out << "ABC##D##EF##G##";  
  73. //  out << "ABCD##E##FG##H##IJK##L##MN##O##";  
  74.     out << "ABCD##E##FG##H##IJK##L##MN####";  
  75.     out.close();  
  76.  
  77.     cout<<"按先序序列输入二叉树中结点的值,如:\n-+a##*b##-c##d##/e##f##\n";  
  78.     ifstream in("data.txt");  
  79.     BinaryTree bt;  
  80.     BiTree tree;  
  81.     bt.CreateBiTree(tree,in);  
  82.     in.close();  
  83.     cout<<"二叉树创建完成!\n";  
  84.     cout<<"----------------\n";  
  85.  
  86.     cout<<"递归遍历:\n";  
  87.     cout<<"先序遍历二叉树:\n";  
  88.     bt.PreOrder(tree);  
  89.     cout<<endl;  
  90.       
  91.     cout<<"中序遍历二叉树:\n";  
  92.     bt.InOrder(tree);  
  93.     cout<<endl;  
  94.       
  95.     cout<<"后序遍历二叉树:\n";  
  96.     bt.PostOrder(tree);  
  97.     cout<<endl;  
  98.  
  99.     cout<<"----------------\n";  
  100.  
  101.     cout<<"非递归遍历:\n";  
  102.     cout<<"先序遍历二叉树:\n";  
  103.     bt.RePreOrder(tree);  
  104.     cout<<endl;  
  105.       
  106.     cout<<"中序遍历二叉树:\n";  
  107.     bt.ReInOrder(tree);  
  108.     cout<<endl;  
  109.       
  110.     cout<<"后序遍历二叉树:\n";  
  111.     bt.RePostOrder(tree);  
  112.     cout<<endl;  
  113.       
  114.     cout<<"----------------\n";  
  115.     cout<<"层序遍历二叉树是否为完全二叉树:";  
  116.     if(bt.Complete(tree))  
  117.         cout<<"是\n";  
  118.     else 
  119.         cout<<"不是\n";  
  120.  
  121.     cout<<"此二叉树的深度为:"<<bt.Depth(tree)<<endl;  
  122.     cout<<"此二叉树的总结点个数为:"<<bt.Countleafs(tree)<<endl;  
  123.     cout<<"此二叉树的叶子结点个数为:"<<bt.Countleaf(tree)<<endl;  
  124. }  
  125. //--------------------------------------------------  
  126. int BinaryTree::CreateBiTree(BiTree &T,ifstream &in){  
  127. //按先序序列输入二叉树中结点的值,空格字符表示空树,  
  128. //构造二叉树表表示的二叉树T;  
  129.      char ch;  
  130.      in>>ch;  
  131.      if(ch == '#') T = NULL;  
  132.      else{  
  133.          T = (BiTNode*)malloc(sizeof(BiTNode));  
  134.          if(T == NULL) return ERROR;//*/if(!(T = new BiTNode)) exit(OVERFLOW);  
  135.          T -> data = ch;//生成根节点  
  136.          int temp = CreateBiTree(T -> lchild,in) + CreateBiTree(T -> rchild,in);//构造右子树  
  137. //       CreateBiTree(T -> lchild,in)//构造左子树  
  138. //       CreateBiTree(T -> rchild,in);//构造右子树  
  139.      }//else  
  140.      return OK;  
  141. }//CreateBiTree  
  142. //--------------------------------------------------  
  143. void BinaryTree::PreOrder(BiTree &T){//递归函数:先序遍历以T为根的二叉树  
  144.     if(T != NULL){//递归结束条件  
  145.         cout<<T -> data<<" ";//访问根节点  
  146.         PreOrder(T -> lchild);//先序遍历根节点的左子树  
  147.         PreOrder(T -> rchild);//先序遍历根节点的右子树  
  148.  
  149.     }  
  150. }//PreOrder  
  151. //--------------------------------------------------  
  152. void BinaryTree::InOrder(BiTree &T){//递归函数:中序遍历以T为根的二叉树  
  153.     if(T != NULL){//递归结束条件  
  154.         InOrder(T -> lchild);//中序遍历根节点的左子树  
  155.         cout<<T -> data<<" ";//访问根节点  
  156.         InOrder(T -> rchild);//中序遍历根节点的右子树  
  157.     }  
  158. }//InOrder  
  159. //--------------------------------------------------  
  160. void BinaryTree::PostOrder(BiTree &T){//递归函数:后序遍历以T为根的二叉树  
  161.     if(T != NULL){//递归结束条件  
  162.         PostOrder(T -> lchild);//后序遍历根节点的左子树  
  163.         PostOrder(T -> rchild);//后序遍历根节点的右子树  
  164.         cout<<T -> data<<" ";//访问根节点  
  165.     }  
  166. }//PostOrder  
  167. //--------------------------------------------------  
  168. void BinaryTree::RePreOrder(BiTree &T){//非递归函数:先序遍历以T为根的二叉树  
  169.     stack<BiTree> s;  
  170.     s.push(T);//根指针进栈  
  171.     while(!s.empty()){  
  172.         BiTree b = s.top();  
  173.         if(!s.empty()){//访问结点  
  174.             b = s.top();  
  175.             s.pop();  
  176.             if(b -> data == NULL) cout<<"error";  
  177.             else 
  178.                 cout<<b -> data<<" ";  
  179.         }//if  
  180.         if(b -> rchild) s.push(b -> rchild); //若右孩子存在,则入栈  
  181.         if(b -> lchild) s.push(b -> lchild); //若左孩子存在,则入栈  
  182.     }//while  
  183. }//RePreOrder  
  184. //--------------------------------------------------  
  185. void BinaryTree::ReInOrder(BiTree &T){//非递归函数:中序遍历以T为根的二叉树  
  186.     stack<BiTree> s;  
  187.     s.push(T);//根指针进栈  
  188.     while(!s.empty()){  
  189.         BiTree b = s.top();  
  190.         while(b){//向左走到尽头  
  191.             s.push(b -> lchild);  
  192.             b = s.top();  
  193.         }//while  
  194.         s.pop();//空指针退栈  
  195.         if(!s.empty()){//访问结点,向右一步  
  196.             b = s.top();  
  197.             s.pop();  
  198.             if(b -> data == NULL) cout<<"error";  
  199.             else 
  200.                 cout<< b -> data<<" ";  
  201.             s.push(b -> rchild);            
  202.         }//if  
  203.     }//while  
  204. }//ReInOrder  
  205. //--------------------------------------------------  
  206. void BinaryTree::RePostOrder(BiTree &T){//非递归函数:后序遍历以T为根的二叉树  
  207.     stack<BiTree> s;  
  208.     BiTree r,p;//使用r标记访问过的右子树  
  209.     p = T;  
  210.     while(p||!s.empty())   
  211.     {   
  212.          if(p)  
  213.          {  
  214.              s.push(p);  
  215.              p = p -> lchild;  
  216.          }//if  
  217.          else 
  218.          {   
  219.                  p = s.top();   
  220.                  if(p -> rchild && p -> rchild != r)  
  221.                  {  
  222.                      p = p -> rchild;  
  223.                      s.push(p);  
  224.                      p = p-> lchild;  
  225.                  }  
  226.                   else 
  227.                   {  
  228.                       s.pop();  
  229.                       cout<<p->data<<" ";  
  230.                       r = p;  
  231.                       p = NULL;  
  232.                   }   
  233.          }//else  
  234.     }//while  
  235. }//RePostOrder  
  236. //--------------------------------------------------  
  237. void BinaryTree::LevelOrder(BiTree T){//借助队列,层序遍历  
  238.     BiTree Q[MaxLength];  
  239.     int front = 0;  
  240.     int rear = 0;  
  241.     BiTree p;  
  242.     if(T){//根节点入队  
  243.         Q[rear] = T;  
  244.         rear = (rear + 1) % MaxLength;  
  245.     }  
  246.     while(front != rear){  
  247.         p = Q[front];  
  248.         cout<<p -> data<<" ";  
  249.         front = (front + 1) % MaxLength;//队头元素出队  
  250.           
  251.         if(p -> lchild){//左孩子不为空,入队  
  252.             Q[rear] = p -> lchild;  
  253.             rear = (rear + 1) % MaxLength;  
  254.         }  
  255.         if(p -> rchild){//右孩子不为空,入队  
  256.             Q[rear] = p -> rchild;  
  257.             rear = (rear + 1) % MaxLength;  
  258.         }  
  259.     }//while  
  260. }//LevelOrder  
  261. //--------------------------------------------------  
  262. bool BinaryTree::Complete(BiTree T){//是否为完全二叉树  
  263.     BiTree Q[MaxLength];  
  264.     int front = 0;  
  265.     int rear = 0;  
  266.     BiTree p;  
  267.  
  268.     if(T == NULL)return true;//!T 即T == NULL  
  269.     else{  
  270.         Q[rear] = T;//根节点入队  
  271.         rear = (rear + 1) % MaxLength;  
  272.         while(front != rear){//队列不空  
  273.             p = Q[front];  
  274.             front = (front + 1) % MaxLength;//队头元素出队  
  275.  
  276.             if(p){  
  277.                 Q[rear] = p -> lchild;//左孩子入队  
  278.                 rear = (rear + 1) % MaxLength;  
  279.                   
  280.                 Q[rear] = p -> rchild;//右孩子入队  
  281.                 rear = (rear + 1) % MaxLength;  
  282.             }//if  
  283.             else{  
  284.                  while(front != rear){//队列不空  
  285.                      p = Q[front];  
  286.                      if(p) return false;  
  287.                      return true;  
  288.                  }//while  
  289.             }//else  
  290.         }//while  
  291.         return true;//队列空则返回是  
  292.     }//else  
  293. }//Complete  
  294. //--------------------------------------------------  
  295. int BinaryTree::Depth(BiTree T){  
  296.     int depthval,depthleft,depthright;  
  297.     if(T == NULL) depthval = 0;  
  298.     else{  
  299.         depthleft = Depth(T -> lchild);  
  300.         depthright = Depth(T -> rchild);   
  301.         depthval = 1 + (depthleft > depthright ? depthleft : depthright);  
  302.     }//else  
  303.     return depthval;  
  304. }//Depth  
  305. //--------------------------------------------------  
  306. int BinaryTree::Countleaf(BiTree T){//二叉树的叶子结点个数  
  307.     int m,n;  
  308.     if(!T) return 0;  
  309.     if(!T -> lchild && !T -> rchild) return 1;  
  310.     else {  
  311.         m = Countleaf(T -> lchild);  
  312.         n = Countleaf(T -> rchild);  
  313.         return(m + n);  
  314.     }//else  
  315. }//Countleaf  
  316. //--------------------------------------------------  
  317. int BinaryTree::Countleafs(BiTree T){//二叉树的总结点个数  
  318.     int m,n;  
  319.     if(!T) return 0;  
  320.     if(!T -> lchild && !T -> rchild) return 1;  
  321.     else {  
  322.         m = Countleafs(T -> lchild);  
  323.         n = Countleafs(T -> rchild);  
  324.         return(m + n + 1);  
  325.     }//else  
  326. }//Countleafs  
  327.  
  328.  

 

你可能感兴趣的:(二叉树)