論 如何畫線索二叉樹[資料結構]

向北的大白熊發表於2020-12-16

題目描述

1.設一棵二叉樹的先序、中序遍歷序列為:先序遍歷序列,ABDFCEGH、 中序遍歷序列,BFDAGEHC
求:
(1) 寫出其後序遍歷序列;
(2) 並畫出它的後序線索二叉樹。

具體講解

先畫出遍歷序列,後根據遍歷序列例如ABC,看A的右子樹是否為空,如果為空,則指向B,再看B,如果B的左子樹為空,則指向A,依次類推,均符合這個規律。

當然,我們也可以引入程式碼進行除錯、執行。

#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)

#define MAXSIZE 100

//*二叉樹資料結構定義*
typedef struct BiTreeNode
{
    char data;
    struct BiTreeNode* left;
    struct BiTreeNode* right;
}BiTreeNode, * BiTree;

//*二叉樹的建立--按照先序方式建立--插入*
void CreateBiTree(BiTree* T)
{
    char val;
    scanf("%c", &val);

    if (val == '#')
        *T = NULL;  //null表示為空枝
    else
    {
        *T = (BiTree)malloc(sizeof(BiTreeNode));
        (*T)->data = val;
        CreateBiTree(&(*T)->left);
        CreateBiTree(&(*T)->right);
    }
}


//*先序遍歷  根左右*
void PreOrderTravel(BiTree T)
{
    if (T == NULL)
        return;
    printf("%c ", T->data);
    PreOrderTravel(T->left);
    PreOrderTravel(T->right);
}

//*中序遍歷 左根右*
void InOrderTravel(BiTree T)
{
    if (T == NULL)
        return;
    InOrderTravel(T->left);
    printf("%c ", T->data);
    InOrderTravel(T->right);
}

//*後序遍歷 左右根*
void TailOrderTravel(BiTree T)
{
    if (T == NULL)
        return;
    TailOrderTravel(T->left);
    TailOrderTravel(T->right);
    printf("%c ", T->data);
}
int main()
{
    BiTree T;
    T = (BiTree)malloc(sizeof(BiTreeNode));
    printf("請給二叉樹按照先序方式依次輸入結點的值(空結點為#):\n");
    CreateBiTree(&T);
    printf("先序方式遍歷結果:\n");
    PreOrderTravel(T);
    printf("\n");
    printf("中序方式遍歷結果:\n");
    InOrderTravel(T);
    printf("\n");
    printf("後序方式遍歷結果:\n");
    TailOrderTravel(T);
    printf("\n");
    return 0;
}

根據題中所給的先、中序遍歷序列,可得二叉樹的表示為:
在這裡插入圖片描述
若按照先序輸入方式一次輸入節點的值(空結點為#),
則輸入為:

AB#DF###CEG##H###

將該輸入帶程式序除錯、執行,得如下結果。
在這裡插入圖片描述
所以其後序遍歷序列為:

FDBGHECA

根據後序遍歷序列,即可畫出後續線索二叉樹。

答案演示

(1)後序序列:FDBGHECA
(2)在這裡插入圖片描述

最後的話

作為一個初學者,對於這方面的知識難免不是很牢固。如果有什麼錯誤,還請各位老鐵,能夠指出。
在這裡插入圖片描述

相關文章