二叉樹的建立和遍歷算法

建立二叉樹并輸出每個字符所在的層數(shù)。如下圖要求輸出A在第一層 B,C在第二層 D,E在第三層

圖片.png

代碼實現(xiàn)如下:

#include<stdafx.h>
#include<stdio.h>
#include<stdlib.h>

typedef char ElemType;

typedef struct BiTNode {
    char data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//創(chuàng)建一顆二叉樹,約定用戶遵照前序遍歷的方式輸入數(shù)據(jù)
void CreateBiTree(BiTree *T) {
    char c;
    scanf_s("%c", &c);
    if (' ' == c) 
    {
        *T = NULL;
    }
    else
    {
        *T = (BiTNode *)malloc(sizeof(BiTNode));
        (*T)->data = c;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
}
//訪問二叉樹節(jié)點的具體操作,你想干嘛
void visit(ElemType elem, int level) {
    printf("%c 位于第%d層\n", elem, level);
}
//前序遍歷二叉樹
void PreOrderTraverse(BiTree T, int level) {
    if (T)
    {
        visit(T->data, level);
        PreOrderTraverse(T->lchild, level + 1);
        PreOrderTraverse(T->rchild, level + 1);
    }
}

int main() {
    int level = 1;
    BiTree T = NULL;
    CreateBiTree(&T);
    PreOrderTraverse(T, level);
    getchar();
    getchar();
    return 0;
}

線索二叉樹

圖片.png

-ltag為0時指向該節(jié)點的左孩子,為1時指向該節(jié)點的前驅(qū)
-rtag為0時指向該節(jié)點的右孩子,為1時指向該節(jié)點的后繼

代碼實現(xiàn)

#include<stdafx.h>
#include<stdio.h>
#include<stdlib.h>

typedef char ElemType;
typedef int PointerTag;
//線索存儲標(biāo)志位 
//link(0):表示指向左右孩子的指針
//Thread(1): 表示指向前驅(qū)后繼的線索
typedef enum {Link, Thread};
typedef struct BiThrNode {
    char data;
    struct BiThrNode *lchild, *rchild;
    PointerTag ltag;
    PointerTag rtag;
}BiThrNode, *BiThrTree;

//全局變量,始終指向剛剛訪問過的節(jié)點
BiThrTree pre;

//創(chuàng)建一顆二叉樹 約定用戶遵照前序遍歷的方式輸入數(shù)據(jù)
void CreateBiThrTree(BiThrTree *T) {
    char c;
    scanf_s("%c", &c);
    if (' ' == c)
    {
        *T = NULL;
    }
    else
    {
        *T = (BiThrNode *)malloc(sizeof(BiThrNode));
        (*T)->data = c;
        (*T)->ltag = Link;
        (*T)->rtag = Link;

        CreateBiThrTree(&(*T)->lchild);
        CreateBiThrTree(&(*T)->rchild);
    }
}

void InThreading(BiThrTree T) {
    if (T)
    {
        InThreading(T->lchild); //遞歸左孩子線索化
        //節(jié)點處理
        if (!T->lchild)    //如果該節(jié)點沒有左孩子,設(shè)置ltag為Thread, 并把lchild指向剛剛訪問的節(jié)點
        {
            T->ltag = Thread;
            T->lchild = pre;
        }
        if (!pre->rchild)
        {
            pre->rtag = Thread;
            pre->rchild = T;
        }
        pre = T;

        InThreading(T->rchild); //遞歸右孩子線索化
    }
}
void InOrderThreading(BiThrTree *p, BiThrTree T) {
    *p = (BiThrTree)malloc(sizeof(BiThrNode));
    (*p)->ltag = Link;
    (*p)->rtag = Thread;
    (*p)->rchild = *p;
    if (!T) {
        (*p)->lchild = *p;
    }
    else
    {
        (*p)->lchild = T;
        pre = *p;
        InThreading(T);
        pre->rchild = *p;
        pre->rtag = Thread;
        (*p)->rchild = pre;
    }
}

void visit(char c) {
    printf("%c", c);
}

//中序遍歷二叉樹 非遞歸
void InOrderTraverse(BiThrTree T) {
    BiThrTree p;
    p = T->lchild;
    while (p != T)
    {
        while (p->ltag == Link)
        {
            p = p->lchild;
        }
        visit(p->data);
        while (p->rtag == Thread && p->rchild != T)
        {
            p = p->rchild;
            visit(p->data);
        }
        p = p->rchild;
    }
}
int main() {
    BiThrTree P, T = NULL;
    CreateBiThrTree(&T);
    InOrderThreading(&P, T);
    printf("中序遍歷結(jié)果為:");
    InOrderTraverse(P);

    getchar();
    getchar();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容