層次遍歷構建二叉樹c語言,c語言二叉樹的創建與遍歷

本文目錄一覽:

如何用C語言實現層次遍歷二叉樹?

2叉樹沒有層次遍歷

只有先序遍歷,中序遍歷,和後續遍歷三種

用c語言編一個演算法 按層次遍歷二叉樹的結點?

#includestdio.h

#includemalloc.h

// 定義隊列的最大長度

#define QUEUE_LENGTH 100

//

// 二叉樹與雙向鏈表數據結構定義,

//

typedef struct struNode

{

int data;

struct struNode *lchild; //二叉樹中的左子樹或雙向鏈表中的前向指針

struct struNode*rchild; //二叉樹中的右子樹或雙向鏈表中的後向指針

}BitNode , *BitNodePtr , DuLNode , *DuLNodePtr;

//

// 生成二叉樹

//

BitNodePtr Create_bitree()

{

int m;

BitNodePtr T;

T = NULL;

scanf(“%d”, m);

if(m)

{

T = (BitNodePtr)malloc(sizeof(BitNode));

T-data = m;

T-lchild = Create_bitree();

T-rchild = Create_bitree();

}

return T;

}

//

// 層次遍歷二叉樹

//

void ReadBitTree(BitNodePtr pRoot)

{

BitNodePtr pQueue[QUEUE_LENGTH];

int head = 0 , tail = 1;

pQueue[0] = pRoot;

//結束的條件是head向後移動一個位置後,與tail重合

while (head != tail)

{

printf(“%d ” , pQueue[head]-data);

//左孩子入隊列

if (pQueue[head]-lchild)

{

pQueue[tail] = pQueue[head]-lchild;

tail = (tail + 1) % QUEUE_LENGTH;

if (tail == head)

{

//隊列長度太小,退出

printf(“Queue overflow!”);

return;

}

}

//右孩子入隊列

if (pQueue[head]-rchild)

{

pQueue[tail] = pQueue[head]-rchild;

tail = (tail + 1) % QUEUE_LENGTH;

if (tail == head)

{

//隊列長度太小,退出

printf(“Queue overflow!”);

return;

}

}

//隊首出隊列

head = (head + 1) % QUEUE_LENGTH;

}

printf(“\n”);

return;

}

void main()

{

BitNodePtr Root;

Root = Create_bitree();

ReadBitTree(Root);

return;

}

由中序遍歷和層次遍歷還原二叉樹。C語言實現

經測,該代碼已經修改正確,只需在void BuildTree(char *level,char *inorder,pBiTree T)這裡的最後一個變數T改為引用即可。還有一個地方判斷調用右子樹的地方的判斷條件。

#include stdio.h

#include stdlib.h

#include string.h

typedef struct _BiTree

{

    char data;

    struct _BiTree *lchild;

    struct _BiTree *rchild;

}BiNode, *pBiTree;

void BuildTree(char *level,char *inorder,pBiTree T)

{

    int i;

    int len=strlen(level);  //取得層次遍歷長度

    int pos=0;

    if(len==0)

        return ;

    char *p=strchr(inorder,level[0]);

    if(p==NULL)     //如果為空則拋棄第一個,跳到下一個;

    {

        char *L=(char*)malloc(sizeof(char)*len);    //開闢數組

        strncpy(L,level+1,len-1);       //捨棄第一個

        L[len-1]=0;

        BuildTree(L,inorder,T);     //調用建樹函數

        return ;

    }

    pos=p-inorder;      //得到中序遍歷左子樹字元串長度

    T-data=level[0];   //為根節點賦值

    T-lchild=NULL;

    T-rchild=NULL;

    if(pos!=0)  //左子樹的遞歸調用

    {

        T-lchild=(pBiTree)malloc(sizeof(BiNode));

        char *left_level=(char*)malloc(sizeof(char)*len);

        char *left_inor=(char*)malloc(sizeof(char)*(pos));

        strncpy(left_level,level+1,len-1);  //捨去層次遍歷第一個

        strncpy(left_inor,inorder,pos);     //截取左子樹字元串

        left_level[len-1]=0;

        left_inor[pos]=0;

        BuildTree(left_level,left_inor,T-lchild);

    }

    if(pos  strlen(inorder)-1)      //右子樹的遞歸調用

    {

        T-rchild=(pBiTree)malloc(sizeof(BiNode));

        char *right_level=(char*)malloc(sizeof(char)*(len));

        char *right_inor=(char*)malloc(sizeof(char)*(len-pos));

        strncpy(right_level,level+1,len-1);

        strncpy(right_inor,inorder+pos+1,len-pos-1);

        right_level[len-1]=0;

        right_inor[len-pos-1]=0;

        BuildTree(right_level,right_inor,T-rchild);

    }

}

void priOrder(pBiTree T)

{

    if (T != NULL){

        printf (“%c”, T-data);

        priOrder(T-lchild);

        priOrder(T-rchild);

    }

}

void postOrder(pBiTree T)

{

    if (T != NULL){

        postOrder(T-lchild);

        postOrder(T-rchild);

        printf (“%c”, T-data);

    }

}

void freeNode(pBiTree T)

{

    if (T != NULL){

        freeNode(T-lchild);

        freeNode(T-rchild);

        free(T);

    }

}

int main()

{

    pBiTree root;

    char level[28], inorder[28];

    int n;

    scanf (“%d”, n);

    //fflush(stdin);

    getchar();

    while (n –){

        scanf (“%s%s”, level, inorder);

        root = (pBiTree)malloc(sizeof(BiNode));

        BuildTree(level, inorder, root);

        priOrder(root);

        printf (“\n”);

        postOrder(root);

        printf (“\n”);

        //freeNode(root);

    }

    return 0;

}

求用C語言實現二叉樹層次遍歷的遞歸演算法,謝謝!!!

演算法思想:層次遍歷目前最普遍用的就是隊列的那種方式,不是遞歸,但是用到while循環,既然題目要求用遞歸,可以用遞歸實現該while循環功能。演算法如下:

void TransLevele(Tree *r)

{

if (r==NULL)

{

return ;

}

printf(“%c”,r-ch);

if (r-left != NULL)

{

InsertQueue(r-left);

}

if (r-right != NULL)

{

InsertQueue(r-right);

}

Tree *t = DeleteQueue();

TransLevele(t);

}

//測試程序,創建樹輸入例如ABD##E##C##,根左右創建的方式。

如下代碼是測試通過的。

#include “stdlib.h”

#define MAX 100

typedef int Element;

typedef struct tree

{

Element ch;

struct tree *left;

struct tree *right;

}Tree;

typedef struct queue

{

Tree *a[MAX];

int front;

int rear;

}Queue;

Queue Qu;

void Init();

int InsertQueue(Element ch);

Tree *DeleteQueue();

void CreateTree(Tree **r);

void TransLevele(Tree *r);

void PrintTree(Tree *r);

int main()

{

Tree *r=NULL;

CreateTree(r);

PrintTree(r);

printf(“\n”);

TransLevele(r);

return 0;

}

void Init()

{

int i=0;

for (i=0; iMAX; i++)

{

Qu.a[i] = NULL;

}

Qu.front = 0;

Qu.rear = 0;

}

int InsertQueue(Tree *r)

{

if ( (Qu.rear+1)%MAX == Qu.front)

{

printf(“Queue full!”);

return 0;

}

Qu.a[Qu.rear] = r;

Qu.rear = (Qu.rear+1)%MAX;

return 1;

}

Tree *DeleteQueue()

{

if (Qu.front == Qu.rear)

{

printf(“Queue empty”);

return NULL;

}

Tree *t=NULL;

t = Qu.a[Qu.front];

Qu.front = (Qu.front+1)%MAX;

return t;

}

void CreateTree(Tree **r)

{

Element ch;

ch=getchar();

if (ch==’#’)

{

(*r)=NULL;

return ;

}

*r = (Tree *)malloc(sizeof(Tree));

(*r)-ch = ch;

CreateTree(((*r)-left));

CreateTree(((*r)-right));

}

void PrintTree(Tree *r)

{

if (r==NULL)

{

return ;

}

printf(“%c”,r-ch);

PrintTree(r-left);

PrintTree(r-right);

}

void TransLevele(Tree *r)

{

if (r==NULL)

{

return ;

}

printf(“%c”,r-ch);

if (r-left != NULL)

{

InsertQueue(r-left);

}

if (r-right != NULL)

{

InsertQueue(r-right);

}

Tree *t = DeleteQueue();

TransLevele(t);

}

C語言 層次遍歷二叉樹

//隊列的操作代碼你自己寫吧?

void

HierarchyBiTree(BiTree

Root){

LinkQueue

*Q;

//

保存當前節點的左右孩子的隊列

InitQueue(Q);

//

初始化隊列

if

(Root

==

NULL)

return

;

//樹為空則返回

BiNode

*p

=

Root;

//

臨時保存樹根Root到指針p中

Visit(p-data);

//

訪問根節點

if

(p-lchild)

EnQueue(Q,

p-lchild);

//

若存在左孩子,左孩子進隊列

if

(p-rchild)

EnQueue(Q,

p-rchild);

//

若存在右孩子,右孩子進隊列

while

(!QueueEmpty(Q))

//

若隊列不空,則層序遍歷

{

DeQueue(Q,

p);

//

出隊列

Visit(p-data);//

訪問當前節點

if

(p-lchild)

EnQueue(Q,

p-lchild);

//

若存在左孩子,左孩子進隊列

if

(p-rchild)

EnQueue(Q,

p-rchild);

//

若存在右孩子,右孩子進隊列

}

DestroyQueue(Q);

//

釋放隊列空間

return

;

}

原創文章,作者:QFPF,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/135089.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QFPF的頭像QFPF
上一篇 2024-10-04 00:10
下一篇 2024-10-04 00:10

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python遍歷集合中的元素

    本文將從多個方面詳細闡述Python遍歷集合中的元素方法。 一、for循環遍歷集合 Python中,使用for循環可以遍歷集合中的每個元素,代碼如下: my_set = {1, 2…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python如何遍歷字典中的key和value

    本文將詳細講解Python中如何遍歷字典中的key和value,包括多種遍歷方式以及在遍歷過程中的一些應用場景。 一、遍歷字典中的key和value 在Python中,字典是一種無…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論