bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

【我的算法筆記】二叉樹的創建、二叉樹的遍歷(遞歸、非遞歸)-創新互聯

創新互聯建站于2013年創立,先為肅北等服務建站,肅北等地企業,進行企業商務咨詢服務。為肅北企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
文章目錄
  • 目錄

    文章目錄

    前言

    樹的結構體定義

    二叉樹的創建(先序遞歸)?

    二叉樹的先序遍歷(遞歸)

    二叉樹的中序遍歷(遞歸)?

    二叉樹的后序遍歷(遞歸)

    二叉樹的先序非遞歸遍歷算法1

    二叉樹的先序非遞歸遍歷算法2

    二叉樹的中序非遞歸算法

    二叉樹的后序非遞歸算法1

    二叉樹的非遞歸后序遍歷算法2

    二叉樹的層次遍歷算法

    主函數?


前言

本篇文章主要包括二叉樹的創建以及二叉樹的前序、中序、后序遍歷的遞歸算法以及前序、中序、后序、層次遍歷的非遞歸算法


  • 樹的結構體定義
typedef struct node{
    char data;
    struct node *lchild,*rchild;
}*BiTree;
  • 二叉樹的創建(先序遞歸)?
//遞歸建立二叉樹(先序遍歷)
void CreatBiTree(BiTree &T){
    char c;
    cin>>c;
    if(c=='0'){
        T=NULL;
    }else{
        T=new node;
        T->data=c;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
}
  • 二叉樹的先序遍歷(遞歸)
//先序遍歷遞歸
void PreOrder(BiTree T){
    if(T!=NULL){
        cout<data<<' ';
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}
  • 二叉樹的中序遍歷(遞歸)?
//遞歸中序遍歷
void InOrder(BiTree T){
    if(T!=NULL){
        InOrder(T->lchild);
        cout<data<<' ';
        InOrder(T->rchild);
    }
}
  • 二叉樹的后序遍歷(遞歸)
//遞歸后序遍歷算法
void PostOrder(BiTree T){
    if(T!=NULL){
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        cout<data<<' ';
    }
}
  • 二叉樹的先序非遞歸遍歷算法1

頭文件中要包含#include

//非遞歸先序遍歷算法1
void PreOrder1(BiTree T){
    if(T!=NULL){
        stackSt;
        BiTree p;
        St.push(T);
        while(!St.empty()){
            p=St.top();
            St.pop();
            cout<data<<' ';
            if(p->rchild!=NULL){
                St.push(p->rchild);
            }
            if(p->lchild!=NULL){
                St.push(p->lchild);
            }
        }
    }
}
  • 二叉樹的先序非遞歸遍歷算法2
//非遞歸先序遍歷2
void PreOrder2(BiTree T){
    if(T!=NULL){
        stackSt;
        BiTree p=T;
        while(!St.empty()||p!=NULL){
            while(p!=NULL){
                cout<data<<' ';
                St.push(p);
                p=p->lchild;
            }
            if(!St.empty()){
                p=St.top();
                St.pop();
                p=p->rchild;
            }
        }
    }
}
  • 二叉樹的中序非遞歸算法

與先序非遞歸遍歷算法2的區別僅在于節點值輸出的位置不同

//非遞歸中序遍歷
void InOrder1(BiTree T){
    if(T!=NULL){
        stackSt;
        BiTree p=T;
        while(!St.empty()||p!=NULL){
            while(p!=NULL){
                St.push(p);
                p=p->lchild;
            }
            if(!St.empty()){
                p=St.top();
                St.pop();
                cout<data<<' ';
                p=p->rchild;
            }
        }
    }
}
  • 二叉樹的后序非遞歸算法1

需要用到兩個棧

//非遞歸后序遍歷算法1
void PostOrder1(BiTree T){
    if(T!=NULL){
        stackSt1;
        stackSt2;
        BiTree p=NULL;
        St1.push(T);
        while(!St1.empty()){
            p=St1.top();
            St1.pop();
            St2.push(p);
            if(p->lchild!=NULL){
                St1.push(p->lchild);
            }
            if(p->rchild!=NULL){
                St1.push(p->rchild);
            }
        }
        while(!St2.empty()){
            p=St2.top();
            St2.pop();
            cout<data<<' ';
        }
    }
}
  • 二叉樹的非遞歸后序遍歷算法2

這個算法具有一個良好的性質:每當訪問到這個節點時,棧中存放的是這個節點的祖先節點。由這個算法可以改寫得到其他許多問題的解法。

//非遞歸后序遍歷算法2
void PostOrder2(BiTree T){
    if(T!=NULL){
        stackSt;
        BiTree p=T;
        BiTree r=NULL;
        while(p!=NULL||!St.empty()){
            if(p!=NULL){
                St.push(p);
                p=p->lchild;
            }
            else{
                p=St.top();
                if(p->rchild!=NULL&&p->rchild!=r){
                    p=p->rchild;
                }else{
                    p=St.top();
                    St.pop();
                    cout<data<<' ';
                    r=p;
                    p=NULL;
                }
            }
        }
    }
}
  • 二叉樹的層次遍歷算法

頭文件中要包含#include

//層次遍歷
void LevelOrder(BiTree T){
    queueQ;
    Q.push(T);
    BiTree p;
    while(!Q.empty()){
        p=Q.front();
        Q.pop();
        cout<data<<' ';
        if(p->lchild!=NULL){
            Q.push(p->lchild);
        }
        if(p->rchild!=NULL){
            Q.push(p->rchild);
        }
    }
}
主函數?
int main(){
    system("chcp 65001");//控制輸出中文
    BiTree T;
    CreatBiTree(T);
    cout<<"二叉樹的先序遍歷序列為:";
    PreOrder(T);
    cout<

運行結果如下圖所示:

上例中建的樹如下圖所示:

總結

? 以上就是這篇文章的全部內容,介紹了二叉樹的構建以及遍歷。

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

當前標題:【我的算法筆記】二叉樹的創建、二叉樹的遍歷(遞歸、非遞歸)-創新互聯
URL地址:http://vcdvsql.cn/article46/cdiohg.html

成都網站建設公司_創新互聯,為您提供網站收錄外貿網站建設Google做網站移動網站建設定制網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯