1. 程式人生 > >資料結構 BFS層次遍歷二叉樹【C語言版本】

資料結構 BFS層次遍歷二叉樹【C語言版本】

//案例輸入(其中的“#”表示空,並且輸入過程中不要加回車)

輸入序列ABC##DE#G##F###

輸入序列ABD##E##CF#G###

輸入序列ABD###C##

#include <stdio.h>	//測試OK,可以執行 
#include <stdlib.h>

typedef struct BiTNode      //定義樹的結構
{
    char data;
    struct BiTNode *Lchild;
    struct BiTNode *Rchild;
} BiTNode,*BiTree;

BiTree Create(BiTree T)   //建立二叉樹(先序)               //改的這個地方
{
    char ch;
    ch=getchar();
    if(ch=='#')
        T = NULL;
    else
    {
        if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
            printf("Error!");
        T->data=ch;
        T->Lchild = Create(T->Lchild);
        T->Rchild = Create(T->Rchild);
    }
    return T;
}
typedef BiTree QueueElementType ;

typedef struct Node{
    QueueElementType data;
    Node *next;
}LinkQueueNode;

typedef struct {
    LinkQueueNode *Front;
    LinkQueueNode *Rear;
}LinkQueue;

//鏈 佇列 初始化
int init_Queue(LinkQueue *Q)
{
    Q->Front = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if(Q->Front !=NULL){
        Q->Rear = Q->Front;
        Q->Front->next = NULL;
        return 1;
    }
    else
        return 0;  //溢位
}
//鏈 佇列 入隊
int EnterQueue(LinkQueue *Q,QueueElementType x)
{
    LinkQueueNode *NewNode;
    NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if(NewNode !=NULL){
        NewNode->data = x;
        NewNode->next = NULL;
        Q->Rear->next =NewNode;
        Q->Rear =NewNode;
        return 1;
    }
    else
        return 0;
}
//鏈佇列 出隊
int Delete_Queue(LinkQueue *Q,QueueElementType *x)
{
    if(Q->Front == Q->Rear){
        return 0;
    }
    LinkQueueNode *p;

    p = Q->Front->next;
    Q->Front->next = p->next;
    if(Q->Rear == p){
        Q->Rear = Q->Front;
    }
    *x = p->data;
    free(p);
    return 1;
}
//判斷 佇列是否為空
int Is_empty(LinkQueue *Q)
{
    if(Q->Front == Q->Rear)
        return 1;
    return 0;
}
//層次 遍歷樹 (OK) 
void BFS_Queue(BiTree T)
{
    if(T == NULL)
        return;
    LinkQueue LQ;
    init_Queue(&LQ);

    EnterQueue(&LQ,T);

    BiTree temp;
    while( !Is_empty(&LQ) )
    {
        if( Delete_Queue(&LQ,&temp) )
            printf("%c ",temp->data);
        if(temp->Lchild) EnterQueue(&LQ,temp->Lchild); //這個位置原來都是  T->Lchild 怪不得呢 
        if(temp->Rchild) EnterQueue(&LQ,temp->Rchild);
    }
	printf("\n");
}
int main()
{
  printf("下面用先序遍歷建立二叉樹:");
  printf("請輸入樹 的內容,形式如ABD##E##CF#G###('#'代表空): \n\n"); 
    BiTree T=Create(T); //建立樹
    printf("\n\n下面輸出 層次遍歷的結果 (每一層的結點都是從左向右的順序輸出):\n");
    BFS_Queue(T); //層次 遍歷 樹
    return 0;
}

相關推薦

資料結構 BFS層次C語言版本

//案例輸入(其中的“#”表示空,並且輸入過程中不要加回車) 輸入序列ABC##DE#G##F### 輸入序列ABD##E##CF#G### 輸入序列ABD###C## #include <stdio.h> //測試OK,可以執行 #include <s

C++資料結構--按層次

class node {    public:       T val; //節點值 node<T>* left; //左節點  node<T>* right; //右節點 node():val(T()),left(nullptr),right(nullptr){} node(T v,

資料結構知識整理 - 的應用

主要內容 建立二叉連結串列 複製二叉樹 計算二叉樹深度 統計二叉樹的結點個數   建立二叉連結串列 在先序遍歷的遞迴演算法中,將輸出語句改為輸入語句即可。(可回顧“遞迴演算法”) 需要注意的是,遞迴演算法會遍歷滿二叉樹中的每一個結點,

資料結構-----後序非遞迴演算法(利用堆疊實現)

一、非遞迴後序遍歷演算法思想 後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。 第一次進棧時,在遍歷左子樹的過程中將"根"節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個"根"節點,但不能立即訪問,只能藉助於這個"根"

劍指offer從上往下列印層次python

題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 採用佇列的思想,出佇列則列印,然後左節點右節點分別入佇列 注意如果需要兩個不同的列表,一定不能用list = result = []這樣

資料結構-從底向上層次

【題目來自灰灰考研】 二叉樹採用二叉連結串列進行儲存(如下所示),每個結點包含資料域Data,左孩子指標域left和右孩子指標域right。請設計演算法給定一顆樹,返回其節點值從底向上的層次序遍歷(按從葉節點所在層到根節點所在的層遍歷,然後逐層從左往右遍歷)。 Typed

leet code Binary Tree Level Order Traversal II 層次

leet code 題目:https://leetcode.com/problems/binary-tree-level-order-traversal-ii/ 層次遍歷二叉樹: 思路:使用佇列層次遍歷二叉樹, 考點: 1.使用佇列,先彈出佇列對頭,把隊頭元素的左節點和右節點加入佇列

層次和採用棧的方式

//中序遍歷非遞迴 @Override public void inOrderByStack() { System.out.println("中序遍歷非遞迴操作"); //建立棧 Deque<Node> stack=new LinkedList&

層次以及第K層

層次遍歷的時候用到了,STL中的佇列。 void LevelOrder(BtNode *ptr) { queue<BtNode*> que; que.push(ptr); while (!que.empty()) {

層次-三種不同的方法

給定一棵二叉樹,要求進行分層遍歷,每層的節點值單獨列印一行,下圖給出事例結構: 對此二叉樹遍歷的結果應該是: 1, 2 , 3 4, 5, 6 7, 8 第一種方法,就是利用遞迴的方法,按層進行列印,我們把根節點當做第0層,之後層次依次增加,如果我們想列印第二層怎麼辦呢,

層次演算法

問題:按層次遍歷二叉樹 在網上看了一些按層次遍歷二叉樹的演算法,這裡修改了一下通過佇列來按層次遍歷二叉樹的演算法 -------------------------------------------

力扣算法題—094中序

中序 非遞歸 輸入 root urn clas 進階 else oid 給定一個二叉樹,返回它的中序 遍歷。 示例: 輸入: [1,null,2,3] 1 2 / 3 輸出: [1,3,2] 進階: 遞歸算法很簡單,

資料結構基礎 層次和中序還原

【問題描述】 給出一個層次遍歷,和一箇中序遍歷的結果字串 層次  A B C D E F G 中序  D B A F E G C 其對應的二叉樹是:        A      /  /      B  C      /  /      D  E        / /  

資料結構與演算法隨筆之------(一文搞懂的四種

二叉樹的遍歷 二叉樹的遍歷(traversing binary tree)是指從根結點出發,按照某種次序依次訪問二叉樹中所有的結點,使得每個結點被訪問依次且僅被訪問一次。 遍歷分為四種,前序遍歷,中序遍歷,後序遍歷及層序遍歷 前序 中

資料結構實驗之 SDUT 3341

#include <bits/stdc++.h> using namespace std; struct Tree { char data; struct Tree *right; struct Tree *left; }; char str[55]; in

SDUTOJ1291資料結構上機測試4.1:與應用1

以SDUTOJ1291資料結構上機測試4.1:二叉樹的遍歷與應用1為例 https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2711/pid/1291 思路: 遞迴實現,化解子問

資料結構--

遍歷二叉樹 #include "pch.h" #include <iostream> #include <queue> #include <stdlib.h> #define MAX_TREE_SIZE 100 #define OK 1 #defin

資料結構實驗之

Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,de,g,f, (其中,表示空結點)。請建立二叉樹並按中序和後序的方式遍歷該二叉樹。 Input 連續輸入多組資料,每組資料輸入一個長度小於50個字元的字串。 Outpu

資料結構(四)之非遞迴

void Inoder(Bitree root)//二叉樹的中序遍歷非遞迴 { IniStack(&S);//初始化一個棧 p=root; while(!isEmpty(S)||p!=NULL) { if(p!=NULL)//如果當前結點不為空進棧 { pu

SDUT3341資料結構實驗之

cbegdfacgefdba #include <stdio.h> #include <stdlib.h> struct node { char data; struct node *lc,*rc; }; char s[51]; int c; st