二叉樹的遍歷及應用

Griplan發表於2020-11-05

前言

二叉樹這種資料結構雖然能有特點的儲存資料,比如二叉搜尋樹(一種樹,左節點小於根節點,右節點大於根節點)和平衡二叉樹(二叉搜尋樹的升級,為了保證搜尋樹不失去平衡,變成連結串列,所以規定左右子樹高度差不能超過1),但是操作起來就有難度了,要找一個資料或者插入刪除,如何找到我們想找到的資料或者位置呢?由於非線性,所以遍歷起來要按照一定的規則,保證每個結點被訪問且只被訪問一次,其實就是把非線性結構變成線性,這裡用下圖所示樹來介紹前中後序三種遍歷方法。
在這裡插入圖片描述

先序遍歷

如果樹空返回NULL,否則按照 根結點->左子樹->右子樹 的順序來遍歷,程式碼實現如下

void PreOrderTraverse(BiTree T){
    if(T){
       cout<<T->data;
       PreOrderTraverse(T->lchild);
       PreOrderTraverse(T->rchild);
    }
}

按照先序遍歷遍歷上圖所示的樹,得到訪問次序為:ABDEHIJKCFG

中序遍歷

如果樹空返回NULL,否則按照 左子樹->根結點->右子樹 的順序來遍歷,程式碼實現如下

void InOrderTraverse(BiTree T){
    if(T){
       InOrderTraverse(T->lchild);
       cout<<T->data;
       InOrderTraverse(T->rchild);
    }
}

按照先序遍歷遍歷上圖所示的樹,得到訪問次序為:DBHEJIKAFCG

後序遍歷

如果樹空返回NULL,否則按照 根結點->左子樹->右子樹 的順序來遍歷,程式碼實現如下

void PastOrderTraverse(BiTree T){
    if(T){
       PastOrderTraverse(T->lchild);
       PastOrderTraverse(T->rchild);
       cout<<T->data;
    }
}

按照先序遍歷遍歷上圖所示的樹,得到訪問次序為:DHJKIEBFGCA

應用

先序遍歷的順序建立二叉連結串列

//申請節點空間T,賦值ch
//遞迴建立左右子樹
void CreatBiTree(BiTree &T){
    cin>>ch;
    if(ch=='#') T=NULL;
    else{
        T=new BiTNode;
        T->data=ch;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
}

先序複製二叉樹

void Copy(BiTree T,BiTree &NewT){
    if(T==NULL){
        NewT=NULL;
        return ;
    }else{
        NewT=new BiTNode;
        NewT->data=T->data;
        Copy(T->lchild,NewT->lchild);
        Copy(T->rchild,NewT->rchild);
    }
}

後序計算二叉樹深度

int dep(BiTree T){
    if(T==NULL) return 0;
    else{
        m=dep(T->lchild);
        n=dep(T->rchild);
        if(m>n)return (m+1);
        else return (n+1);s
    }
}

統計結點個數

int Count(BiTree T){
    if(T==NULL) return 0;
    else return (Count(T->rchild)+Count(T->lchild)+1);
}

統計度為1的結點

int NodeCount( BiTree T){
if(T==NULL) {
    return 0;
    }
   if(T->lchild==NULL&&T->rchild!=NULL||T->rchild==NULL&&T->lchild!=NULL){
    
    return 1+NodeCount(T->lchild)+NodeCount(T->rchild);
}
return NodeCount(T->lchild)+NodeCount(T->rchild);
} 

統計度為2的結點

int NodeCount( BiTree T){
if(T==NULL) {
    return 0;
    }
   if(T->lchild==NULL&&T->rchild!=NULL||T->rchild==NULL&&T->lchild!=NULL){
    
    return 2+NodeCount(T->lchild)+NodeCount(T->rchild);
}
return NodeCount(T->lchild)+NodeCount(T->rchild);
}

相關文章