數據結構——二叉樹學習

什麼是樹

  • 樹的定義:樹是n個(n>=0)有限節點組成一個具有層次關係的集合。
  • 根及子樹:在任意一個非空樹中,有且僅有一個特定的稱爲根的結點,當n>1時,其餘結點又可以分爲m(m>0)個互不相交的有限集T1,T2,…Tm,其中每一個集合本身又是一顆樹,並稱爲根的子樹。
  • 數的基本術語:

    • 結點:樹中包含一個數據元素和若干指向其子樹的分支的集合叫做樹的結點
    • 度:結點擁有的子樹稱爲結點的度
    • 葉子(終端結點):度爲0的結點稱爲終端結點或者是葉子
    • 分支結點(非終端結點):度不爲0的結點稱爲分支結點或者是非終端結點。
    • 孩子/雙親/兄弟:結點的子樹稱爲該結點的孩子,相應的,該結點稱爲孩子的雙親,同一個雙親的孩子互稱兄弟。
    • 祖先/子孫結點的祖先是從根到該節點所經過的分支上的所有結點,反之,以某結點爲根的子樹中的任意結點都是該節點的子孫。
    • 結點的層次:結點的層次從根開始算起,根爲第一層,根的孩子爲第二層…..
    • 樹的深度:樹中結點的最大層次稱爲樹的深度或者是高度
    • 有序樹/無序樹:如果樹中結點的各子樹看成從左到右是有次序的(不能互換),則樹稱爲有序樹,否則稱爲無序樹。
    • 森林: m(m>=0)顆互不相交的樹的集合

什麼是二叉樹

  • 二叉樹(Binary Tree)是n(n大於0)個結點所構成的集合,它或爲空樹,或爲非空樹。
    • 有且僅有一個稱之爲根的結點。
    • 除根結點外的其他結點分爲兩個互不相交的子集,分別稱爲左子樹和右子樹,並且都是二叉樹。
  • 一顆深度爲k且有2k−1個結點的樹稱爲滿二叉樹
  • 完全二叉樹:深度爲k,有n個結點的二叉樹,當且僅當其每一個結點都與深度爲k的滿二叉樹中編號從1至n的結點一一對應時,稱之爲完全二叉樹。
  • 二叉樹的性質
    • 在二叉樹的第i層上最多有2(i−1)個結點(i>=1)
    • 深度爲k的二叉樹最多有2k−1個結點(k>=1)
    • 對任何一個二叉樹T,如果其終端結點數爲n0,度爲2的結點數爲n2,則n0=n2+1

二叉樹的存儲結構

(這裏只介紹鏈式存儲)

typedef struct BiTNode
{
    char data;//結點存儲的值
    struct BiTNode *lchild,*rchild;//分別爲指向左子樹和右子樹的結構體的指針。
}BiTNode,*BiTree;

二叉樹的遍歷

  • 前序遍歷:先序遍歷是先輸出根節點,再輸出左子樹,最後輸出右子樹。
  • 中序遍歷:中序遍歷是先輸出左子樹,再輸出根節點,最後輸出右子樹。
  • 後序遍歷:後序遍歷是先輸出左子樹,再輸出右子樹,最後輸出根節點。

可結合下圖分析:
這裏寫圖片描述

編碼實現

(對於遍歷可以使用遞歸方法,也可以使用非遞歸方法,這裏使用遞歸的方法)

#include <stdio.h>
#include <stdlib.h>
#define Elemtype int

int m,n;
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void Tree_creat(BiTree *T)
{
    char ch;
    scanf("%c",&ch);
    if('#'==ch)
    {
        *T=NULL;
    }
    else{
        *T=(BiTree)malloc(sizeof(BiTNode));
        (*T)->data=ch;
        Tree_creat(&(*T)->lchild);
        Tree_creat(&(*T)->rchild);

    }
}

void visit(char data,int level)
{
    printf("this is %d,data is %c\n",level,data);//打印該結點所在層和值。

}

//前序遍歷
void PreOrderTraverse(BiTree T,int level){
    if(T)
    {
        visit(T->data,level);//對結點進行相關操作
        PreOrderTraverse(T->lchild,level+1);//遞歸遍歷左子樹
        PreOrderTraverse(T->rchild,level+1);//遞歸遍歷右子樹
    }

}
//計算二叉樹的深度
int BiTreeDepth(BiTree T)
{
    if(T==NULL)
        return 0;
    else
    {

        m=BiTreeDepth(T->lchild);
        n=BiTreeDepth(T->rchild);
        if(m>n)
            return m+1;
        else
            return n+1;
    }
}
int main()
{
    int level=1;
    BiTNode* T;
    printf("'#' === NULL\n");
    Tree_creat(&T);//創建二叉樹
    PreOrderTraverse(T,level);//前序遍歷二叉樹
    printf("depth=%d\n",BiTreeDepth(T));
    return 0;
}

這裏寫圖片描述

對於上圖運行:
這裏寫圖片描述

發佈了38 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章