[linux]二叉樹的創建及其遞歸遍歷(C語言實現)

基礎知識html

二叉樹的特色:

每個節點最多有兩棵子樹,因此二叉樹中不存在度大於2的節點,注意,是最多有兩棵,沒有也是能夠的
左子樹和右子樹是有順序的,次序不能顛倒,這點能夠在哈夫曼編碼中體現, 順序不一樣編碼方式不一樣編碼

-即便樹中某個節點中只有一個子樹的花,也要區分它是左子樹仍是右子樹指針

二叉樹通常有五種形態
1.空二叉樹
2.只有一個根節點
3.根結點只有左子樹
4.根節點只有右子樹code


二叉樹的性質

1:在二叉樹的第i層上最多有2^i-1個節點
2:深度爲K的二叉樹之多有2^k-1個節點htm

這裏的深度K意思就是有K層的二叉樹
3:對於任何一棵二叉樹T,若是其終端節點有No個,度爲2的節點數有N2,則No=N2+1
4: 具備n個節點的徹底二叉樹的深度爲[log2n]+1([x]表示不大於x的最大整數)blog

1.二叉樹的存儲結構(二叉鏈表)

//二叉樹的存儲結構,一個數據域,2個指針域
 typedef struct BiTNode
{
     char data;
     struct BiTNode *lchild,*rchild;
  }BiTNode,*BiTree;

2.首先要創建一個二叉樹,創建二叉樹必需要了解二叉樹的遍歷方法。,我在這裏展現的是二叉樹的遞歸創建方式

//我在這裏實現的是,二叉樹的前序遍歷方式建立,若是要使用中序或者後序的方式創建二叉樹,只需將生成結點和構造左右子樹的順序改變便可
 void CreateBiTree(BiTree *T)
  {
      char ch;
      scanf("%c",&ch);
      if(ch=='#')
          *T=NULL;
      else
     {
         *T=(BiTree  )malloc(sizeof(BiTNode));
         if(!*T)
             exit(-1);
          (*T)->data=ch;
          CreateBiTree(&(*T)->lchild);
         CreateBiTree(&(*T)->rchild);
      }
 }

3.二叉樹的遍歷方式(遞歸創建)

void PreOrderTraverse(BiTree T)//二叉樹的先序遍歷
{
    if(T==NULL)
        return ;
    printf("%c ",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}
void InOrderTraverse(BiTree T)//二叉樹的中序遍歷
{
   if(T==NULL)
       return ;
   InOrderTraverse(T->lchild);
    printf("%c ",T->data);
   InOrderTraverse(T->rchild);
}
void PostOrderTraverse(BiTree T)//後序遍歷
{
    if(T==NULL)
        return;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c ",T->data);
}

mac環境代碼實現(完整代碼)

#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void PreOrderTraverse(BiTree T)//二叉樹的先序遍歷
{
    if(T==NULL)
        return ;
    printf("%c ",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}
void InOrderTraverse(BiTree T)//二叉樹的中序遍歷
{
   if(T==NULL)
       return ;
   InOrderTraverse(T->lchild);
    printf("%C ",T->data);
    InOrderTraverse(T->rchild);
}
void PostOrderTraverse(BiTree T)//後序遍歷
{
    if(T==NULL)
        return;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c ",T->data);
}
void CreateBiTree(BiTree *T)
{
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        *T=NULL;
    else
    {
        *T=(BiTree  )malloc(sizeof(BiTNode));
        if(!*T)
            exit(-1);
        (*T)->data=ch;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
}

void pri(){
    printf("\n");
}

int main()
{
    BiTree T;
    printf("輸入樹(#表明空節點 AB#C##D##):");
    CreateBiTree(&T);
    printf("前序遍歷的結果是:");
    PreOrderTraverse (T);
    printf("\n中序遍歷的結果是:");
    InOrderTraverse(T);
    printf("\n後序遍歷的結果是:");
    PostOrderTraverse(T);
    pri();
    return 0;
}

AB#C##D##

相關文章
相關標籤/搜索