二叉樹遍曆的遞迴演算法程式

來源:互聯網
上載者:User
二叉樹的遍曆是典型的遞迴演算法。所謂樹的遍曆是指按某條搜尋路徑訪問樹中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。我的程式給出了二叉樹的先序遍曆,中序遍曆,後序遍曆和求二叉樹的深度。程式如下: 

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAX(a,b) (a>b?a:b)

typedef char TElemType;
typedef int Status;

//二叉樹的二叉鏈表格儲存體結構
typedef struct BiTNode{
  TElemType data;
  struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//先序遍曆產生二叉樹
Status CreatBiTree(BiTree &T){ 
  TElemType ch,temp;
  printf("輸入一個元素: ");
  scanf("%c",&ch);
  temp=getchar(); //結束斷行符號
  if(ch==' ') T=NULL; //輸入空格表示結點為空白樹
  else{
    if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
    T->data=ch; //產生根結點
    CreatBiTree(T->lchild); //構造左子樹
    CreatBiTree(T->rchild); //構造右子樹
  }
  return OK;
}

//列印元素
Status PrintElem(TElemType e){
  printf("%c ",e);
  return OK;
}

//先序遍曆二叉樹
Status PreOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
  if(T){ //二叉樹不為空白時 
    if(Visit(T->data)) //訪問根結點
      if(PreOrderTraverse(T->lchild,Visit)) //先序遍曆左子樹
        if(PreOrderTraverse(T->rchild,Visit)) return OK; //先序遍曆右子樹
    return ERROR;
  }
  else return OK;
}

//中序遍曆二叉樹
Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
  if(T){
    if(InOrderTraverse(T->lchild,Visit))
      if(Visit(T->data))
        if(InOrderTraverse(T->rchild,Visit)) return OK;
    else return ERROR;
  }
  return OK;
}

//後序遍曆二叉樹
Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
  if(T){
    if(PostOrderTraverse(T->lchild,Visit))
      if(PostOrderTraverse(T->rchild,Visit))
        if(Visit(T->data)) return OK;
    else return ERROR;
  }
  return OK;
}

//求二叉樹的深度
int BiTreeDepth(BiTree T){
  if(!T) return 0; //二叉樹為空白樹時
  int Dl=0,Dr=0;
  if(T->lchild) Dl=BiTreeDepth(T->lchild); //求左子樹深度
  if(T->rchild) Dr=BiTreeDepth(T->rchild); //求右子樹深度
  return MAX(Dl,Dr)+1;

//主函數
void main()
{
  BiTree T;
  Status (* Visit)(TElemType);
  Visit=PrintElem;
  CreatBiTree(T);
  printf("/n先序遍曆:");
  PreOrderTraverse(T,Visit);
  printf("/n中序遍曆:");
  InOrderTraverse(T,Visit);
  printf("/n後序遍曆:");
  PostOrderTraverse(T,Visit);
  printf("/n二叉樹深度為%d",BiTreeDepth(T));
  printf("/n程式結束./n");
}

輸出結果為(紅色為鍵盤輸入的資料,輸入的空格沒有顯示出來):

輸入一個元素: A
輸入一個元素: B
輸入一個元素: C
輸入一個元素:  
輸入一個元素:  
輸入一個元素: D
輸入一個元素: E
輸入一個元素:  
輸入一個元素: G
輸入一個元素:  
輸入一個元素:  
輸入一個元素: F
輸入一個元素:  
輸入一個元素:  
輸入一個元素: 

先序遍曆:A B C D E G F 
中序遍曆:C B E G D F A 
後序遍曆:C G E F D B A 
二叉樹深度為5
程式結束.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.