C++实现 二叉树的建立及4种遍历

来源:互联网 发布:网络倾听者 编辑:程序博客网 时间:2024/05/16 14:03

#include"stdio.h"

#include <iostream>

#include"string.h"

#include<stdlib.h>

using namespace std;

#define Max 20    //结点的最大个数

typedef struct node{
  
 char data;
  
 struct node *lchild,*rchild;

}BinTNode;   //自定义二叉树的结点类型

typedef BinTNode *BinTree;    //定义二叉树的指针

int NodeNum,leaf;            //NodeNum为结点数,leaf为叶子数

//==========基于先序遍历算法创建二叉树==============

//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========

BinTree CreateBinTree(){
   
 BinTree T;
   
 char ch;

 ch=getchar();
  
 if(ch=='#')
  
  return(NULL);       //读入#,返回空指针
 
 else{             
 
  T=(BinTNode *)malloc(sizeof(BinTNode));   //生成结点

  if(!T) exit(1);
 
  T->data=ch;
 
  T->lchild=CreateBinTree();        //构造左子树
 
  T->rchild=CreateBinTree();        //构造右子树

  return(T);
   
 }

}//CreateBintree


//========NLR 先序遍历=============

void Preorder(BinTree T){
 
 if(T) {
  
  printf("%c",T->data);    //访问结点
  
  Preorder(T->lchild);    //先序遍历左子树
 
  Preorder(T->rchild);    //先序遍历右子树
   
 }

}//Preorder

//========LNR 中序遍历===============

void Inorder(BinTree T){
  
 if(T) {
 
  Inorder(T->lchild);      //中序遍历左子树
 
  printf("%c",T->data);    //访问结点
 
  Inorder(T->rchild);      //中序遍历右子树
   
 }

}//Inorder

//==========LRN 后序遍历============

void Postorder(BinTree T){ 
 
 if(T) {

  Postorder(T->lchild);    //后序遍历左子树
  
  Postorder(T->rchild);    //后序遍历右子树

  printf("%c",T->data);    //访问结点
   
 }

}//Postorder

//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========

int TreeDepth(BinTree T){
  
 int hl,hr,max;
   
 if(T){

  hl=TreeDepth(T->lchild);    //求左深度
 
  hr=TreeDepth(T->rchild);    //求右深度

  max=hl>hr? hl:hr;           //取左右深度的最大值
  
  NodeNum=NodeNum+1;         //求结点数
 
  if(hl==0&&hr==0) leaf=leaf+1;  //若左右深度为,即为叶子。
 
  return(max+1);
  
 }
  
 else return(0);

}//TreeDepth


//====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========

void Levelorder(BinTree T){
  
 int front=0,rear=1;
  
 BinTNode *cq[Max],*p; //定义结点的指针数组cq

 cq[0]=T;                //根入队
  
 while(front!=rear){

  p=cq[front]; //出队

  front=front==Max-1?0:(front+1);

  printf("%c",p->data);     //出队,输出结点的值
 
  if(p->lchild!=NULL){

   cq[rear]=p->lchild;   //左子树入队

   rear=rear==Max-1?0:(rear+1);

  }
  
  if(p->rchild!=NULL){

   cq[rear]=p->rchild;     //右子树入队

   rear=rear==Max-1?0:(rear+1);
 
  }
   
 }

}//Levelorder

//==========主函数=================

void main()

{
  
 BinTree root;
   
 int i,depth;
   
 printf("/n");

 printf("Creat Bin_Tree;Input preorder:"); //输入完全二叉树的先序序列,
                                                // 用#代表虚结点,如ABD###CE##F##
   
 root=CreateBinTree();       //创建二叉树,返回根结点 
 


   
 do{    //从菜单中选择遍历方式,输入序号。
  
 printf("/t********** select ************/n");
 
 printf("/t1: Preorder Traversal/n");   
 
 printf("/t2: Iorder Traversal/n");
 
 printf("/t3: Postorder traversal/n");
  
 printf("/t4: Level Depth/n"); //按层次遍历之前,先选择,求出该树的结点数。

 printf("/t0: Exit/n");
 
 printf("/t*******************************/n");

 scanf("%d",&i);    //输入菜单序号(-4)
  switch (i){
 
  case 1: printf("Print Bin_tree Preorder: ");
 
   Preorder(root);      //先序遍历
   
   break;

  case 2: printf("Print Bin_Tree Inorder: ");
  
   Inorder(root);      //中序遍历
  
   break;
 
  case 3: printf("Print Bin_Tree Postorder: ");
  
   Postorder(root);    //后序遍历
 
   break;
 
   
  case 4: printf("LevePrint Bin_Tree: ");
 
   Levelorder(root);     //按层次遍历
   
   break;
 
  default: exit(1);

  }
 
  printf("/n");
   
 }while(i!=0);

原创粉丝点击