1. 程式人生 > >二叉樹的程式設計與實現

二叉樹的程式設計與實現

實驗目的:掌握指標變數、動態變數的含義,掌握二叉樹的結構特徵,以及各種儲存結構的特點及適用範圍,掌握指標型別描述、訪問和處理二叉樹的運算;

實驗原理:參照課本 p.95-107, Figure4.13-4.25;

實驗內容:已知以二叉樹表作為儲存結構,寫出按層次順序遍歷二叉樹的演算法

演算法思想:本演算法採用一個佇列 q,先將二叉樹根節點入佇列,然後退佇列,輸出該節點,若它有左子樹,便將左子樹根節點入佇列;若有右子樹,便將右子樹根節點入佇列,直到佇列空為止。因為佇列的特點是先進先出,從而達到按層次順序遍歷二叉樹的目的。

實驗要求
1) 實現二叉樹表的層次遍歷演算法,並給出應用。

相關程式碼


fatal.h

/*
 *  預定義錯誤幫助函式
 */
#include <stdio.h>  
#include <stdlib.h>  

#define Error( Str )        FatalError( Str )  
#define FatalError( Str )   fprintf( stderr, "%s\n", Str ), exit( 1 )  

tree.h

/*
 *樹相關函式及結構宣告
 */
#ifndef _Tree_H  

typedef char ElementType;

struct TreeNode;
typedef
struct TreeNode *Position; typedef struct TreeNode *SearchTree; SearchTree MakeEmpty(SearchTree T); Position Find(ElementType X, SearchTree T); Position FindMin(SearchTree T); Position FindMax(SearchTree T); SearchTree Insert(ElementType X, SearchTree T); SearchTree Delete(ElementType X, SearchTree T); ElementType Retrieve(Position P); void
PrintElement(SearchTree T); void PreOrder(SearchTree T); void InOrder(SearchTree T); void PostOrder(SearchTree T); #endif /* Tree_H */

tree.c

/*
 *相關函式的實現
 */
#include "fatal.h"  
#include "tree.h"  

struct TreeNode
{
    ElementType Element;
    SearchTree Left;
    SearchTree Right;
};

SearchTree
MakeEmpty(SearchTree T)
{
    if (T != NULL)
    {
        MakeEmpty(T->Left);
        MakeEmpty(T->Right);
        free(T);
    }
    return NULL;
}

Position
Find(ElementType X, SearchTree T)
{
    if (T == NULL)
        return NULL;
    if (X < T->Element)
        return Find(X, T->Left);
    else
        if (X > T->Element)
            return Find(X, T->Right);
        else
            return T;
}

/* 對二叉查詢樹的FindMin的遞迴實現 */
Position
FindMin(SearchTree T)
{
    if (T == NULL)
        return NULL;
    else
        if (T->Left == NULL)
            return T;
        else
            return FindMin(T->Left);
}

/* 對二叉查詢樹的FindMax的非遞迴實現 */
Position
FindMax(SearchTree T)
{
    if (T != NULL)
        while (T->Right != NULL)
            T = T->Right;

    return T;
}

SearchTree
Insert(ElementType X, SearchTree T)
{
    if (T == NULL)
    {
        /* Create and return a one-node tree */
        T = malloc(sizeof(struct TreeNode));
        if (T == NULL)
            FatalError("Out of space!!!");
        else
        {
            T->Element = X;
            T->Left = T->Right = NULL;
        }
    }
    else
        if (X < T->Element)
            T->Left = Insert(X, T->Left);
        else
            if (X > T->Element)
                T->Right = Insert(X, T->Right);
    /* Else X is in the tree already;we'll do nothing */

    return T; /* Do not forget this line!!! */
}

SearchTree
Delete(ElementType X, SearchTree T)
{
    Position TmpCell;

    if (T == NULL)
        Error("Element not found");
    else
        if (X < T->Element) /* Go left */
            T->Left = Delete(X, T->Left);
        else
            if (X > T->Element) /* Go Right */
                T->Right = Delete(X, T->Left);
            else /* Found element to be deleted */
                if (T->Left && T->Right) /*Two children */
                {
                    /* Replace with smallest in right subtree */
                    TmpCell = FindMin(T->Right);
                    T->Element = TmpCell->Element;
                    T->Right = Delete(T->Element, T->Right);
                }
                else /* One or zero children */
                {
                    TmpCell = T;
                    if (T->Left == NULL) /* Also handles 0 children */
                        T = T->Right;
                    else if (T->Right == NULL)
                        T = T->Left;
                    free(TmpCell);
                }

    return T;
}

ElementType
Retrieve(Position P)
{
    return P->Element;
}

void
PrintElement(SearchTree T)
{
    printf("%c ", Retrieve(T));
}

void
PreOrder(SearchTree T)
{
    if (T != NULL)
    {
        PrintElement(T);
        PreOrder(T->Left);
        PreOrder(T->Right);
    }
}

void
InOrder(SearchTree T)
{
    if (T != NULL)
    {
        InOrder(T->Left);
        PrintElement(T);
        InOrder(T->Right);
    }

}

void
PostOrder(SearchTree T)
{
    if (T != NULL)
    {
        PostOrder(T->Left);
        PostOrder(T->Right);
        PrintElement(T);
    }
}

main.c

/*
 *程式主函式
 */
#include "tree.h"  
#include <stdio.h>  

int main()
{
    SearchTree T = NULL;
    int i, j, m, n;
    ElementType tmp;
    printf("輸入序列:");
    while (scanf_s("%c", &tmp)) {
        if (tmp == '\n')
            break;
        T = Insert(tmp, T);
    }
    printf("\n前序遍歷  :");
    PreOrder(T);
    printf("\n中序遍歷  :");
    InOrder(T);
    printf("\n後序遍歷 :");
    PostOrder(T);
    printf("\n");
    while (1);
    return 0;
}

結果
這裡寫圖片描述

實驗環境 vs2015

相關推薦

認識程式設計實現

歡迎瀏覽我的個人部落格 轉載請註明出處 https://pushy.site 1. 樹 我們都知道,樹是一種一對多的資料結構,它是由n個有限節點組成的一個具有層次關係的集合,它有如下的特點: 根節點是唯一的(老大當然是一個~); 每個節點都有零個或者必須多個子節點(丁克、獨生子、雙胞

python演算法資料結構-的程式碼實現(46)

一、二叉樹回憶   上一篇我們對資料結構中常用的樹做了介紹,本篇部落格主要以二叉樹為例,講解一下樹的資料結構和程式碼實現。回顧二叉樹:二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subt

順序結構實現的C語言

init 存儲 狀態 sta 分配 left 需要 bre oot #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define

搜索之字典實現

搜索二叉樹、源碼分析、中英文字典 利用搜索二叉樹判斷一個單詞是否拼寫正確: 假設把所有單詞都按照搜索樹的性質插入到搜索二叉樹中,我們判斷一個單詞拼寫是否正確就是在樹中查找該單詞是否存在(查找key是否存在)。/***************************************** *D

平衡的java實現

14. bubuko 概念 tro 細心 後繼 inf 特點 演變 轉載請註明出處! 一、概念 平衡二叉樹是一種特殊的二叉搜索樹,關於二叉搜索樹,請查看上一篇博客二叉搜索樹的java實現,那它有什麽特別的地方呢,了解二叉搜索樹的基本都清楚,在按順序向插入二叉搜索樹

js數據結構之的詳細實現方法

eno data node left 刪除 span pan 先序遍歷 function 數據結構中,二叉樹的使用頻率非常高,這得益於二叉樹優秀的性能。 二叉樹是非線性的數據結構,用以存儲帶有層級的數據,其用於查找的刪除的性能非常高。 二叉樹 數據結構的實現方法如下:

遞迴實現

二叉樹遞迴實現比較符合樹的特點,也較容易理解,程式碼也較為簡單。接下來進行圖文詳解。 C程式碼下載 C++程式碼下載 java程式碼下載 ( 備用地址下載) 導航 1.建立二叉樹 2.前序遍歷二叉樹 3.中序遍歷二叉樹 4.後序遍歷二叉樹 5.層次遍歷

資料結構實現

#include<iostream> #include<string.h> #include<vector> #include <queue> using namespace std; struct BiNode { int val; BiN

PHP演算法-映象的PHP實現

操作給定的二叉樹,將其變換為源二叉樹的映象。 二叉樹的映象定義:源二叉樹 8 / \ 6 10 / \ / \ 5 7 9 11 映象二叉樹 8

的簡單實現

#include<iostream>#include<stdio.h>#include<malloc.h> using namespace std;#define ElemType char#define MaxSize 100 typedef struct node{

的Python實現

樹的定義與基本術語   樹型結構是一類重要的非線性資料結構,其中以樹和二叉樹最為常用,是以分支關係定義的層次結構。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構;在計算機領域中也有廣泛應用,如在編譯程式中,可用樹來表示源程式的語法結構;在資料庫系統中,樹型結構也是資訊的重要組織形式之一;在機

的初步實現

二叉樹的初步實現,寫了有一段時間了,先放出來,然後,有時間的話,會寫圖解以及註釋的,如果有大神發現不足之處,希望可以幫我指出來,感激不盡! //本程式的目的是利用連結串列實現二叉樹,並且實現先序遍歷,中序遍歷,後序遍歷 #include<iostream> using namespace

基於python的 型資料結構,使用AVL使用

樹由n個節點組成的集合,可以遞迴定義資料結構,如果n=0就是空樹 如果n>那麼有樹 概念 根節點、葉子節點 樹的深度(高度) 樹的度 孩子節點、父節點 子樹 二叉樹-遍歷 # 樹型圖示意 E

Java基礎——表示式的Java實現構建(構建+前序、中序、後序遍歷)

1 表示式二叉樹 1.1 定義 二叉樹:在電腦科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。 表示式二叉樹:儲存表示式的二叉樹。 如:45+23*56/2-5(例子來源:https:

C++ 程式設計實戰之遞迴遍歷

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //二叉樹節點 typedef struct BINAR

的基本實現和基本操作

二叉樹的概念: 一棵二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根節點加上兩棵分別稱為左子樹和右子樹的二叉樹組成。 二叉樹的特點: 每個結點最多有兩棵子樹,即二叉樹不存在度大於2的結點 二叉樹的子樹有左右之分,其子樹的次序不能顛倒 二叉樹的五種形態:

程式設計實戰_求葉子節點數目

統計二叉樹中葉子結點的個數: 葉子節點:沒有孩子節點的樹 demo.cpp #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #includ

劍指offer面試題7:重建(java實現

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果都不含重複的數字。例如:輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}則重建二叉樹:其中二叉樹的定義如下:  * publi

LeetCode101——對稱——c++版本實現

題面來啦~ 給定一個二叉樹,檢查它是否是映象對稱的。 例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。 1 / \ 2 2 / \ / \ 3 4 4 3

資料結構之線索的簡單實現

二叉樹的鏈式儲存時會有較多空間的浪費,當一顆有 n 個節點的二叉樹儲存共有2n個指標域,但是隻有n-1個被用到,所以剩下的n+1個都會被浪費掉,因此可以想一種辦法把剩餘的空間利用起來,線索二叉樹應運而生。 將二叉樹重新定義如下每個節點為下列形式 lchild l