天天看點

資料結構先序序列建立二叉樹任務描述相關知識程式設計要求測試說明C/C++代碼

2022.11.19連發兩回。

先序序列建立二叉樹

  • 任務描述
  • 相關知識
  • 程式設計要求
  • 測試說明
  • C/C++代碼

任務描述

本關任務:利用先序周遊建立二叉樹,并給出相應二叉樹的中序周遊結果。

相關知識

為了完成本關任務,你需要掌握:1.二叉樹的前序周遊,2.如何建立一顆二叉樹,3.二叉樹的中序周遊。

二叉樹的前序周遊

前序周遊preorder traversal是指按照先根節點,再左節點,最後右節點的次序通路二叉樹中所有的節點,使得每個節點被通路且僅被通路一次。

例:圖1表示一個二叉樹,前序周遊的順序如節點上面數字所示,結果為ABCDEF。

資料結構先序序列建立二叉樹任務描述相關知識程式設計要求測試說明C/C++代碼

利用先序周遊建立二叉樹,我們需要知道先序周遊的葉子節點,通過增加符合#表示葉子節點的子節點,則圖1的先序周遊為:ABC##D##EF###。

根據先序周遊的過程,首先建立根節點,然後使用遞歸的方法建立左子樹節點,直到遇到符号#,表示到了葉子節點,回溯父節點并建立右子樹節點。

僞代碼如下:

資料結構先序序列建立二叉樹任務描述相關知識程式設計要求測試說明C/C++代碼

二叉樹的中序周遊

中序周遊inorder traversal是指按照先左節點,再根節點,最後右節點的次序通路二叉樹中所有的節點,使得每個節點被通路且僅被通路一次。

例:圖2表示一個二叉樹,中序周遊的順序如節點上面數字所示,結果為CBDAFE。

資料結構先序序列建立二叉樹任務描述相關知識程式設計要求測試說明C/C++代碼

程式設計要求

本關的程式設計任務是補全右側代碼片段CreatBiTree和InOrder中Begin至End中間的代碼,具體要求如下:

在CreatBiTree中,利用先序周遊建立二叉樹,并傳回二叉樹根節點指針。

在InOrder中,完成二叉樹的中序周遊,并輸出周遊結果,中間沒有空格,末尾不換行。

測試說明

平台将自動編譯補全後的代碼,并生成若幹組測試資料,接着根據程式的輸出判斷程式是否正确。

以下是平台的測試樣例:

測試輸入:ABC##D##EF###

預期輸出:CBDAFE

測試輸入:ABCD###E#F##G##

預期輸出:DCBEFAG

開始你的任務吧,祝你成功!

C/C++代碼

//
//  binary_tree.cpp

#include "binary_tree.h"

//建立新結點的工具函數
BTNode* getNewNode(char e)
{
    BTNode* p = (BTNode*)malloc(sizeof(BTNode));
    p->data = e;
    p->lchild = p->rchild = NULL;
    return p;
}


BTNode* CreateTree(char* s, int &i, int len)
// 利用先序周遊建立二叉樹
// 參數:先序周遊字元串s,字元串初始下标i=0,字元串長度len。
// 傳回:二叉樹
{
    // 請在這裡補充代碼,完成本關任務
    /********** Begin *********/
    if(s[i]=='#' || i>len){i++;return NULL;}
    BTNode* BTP = getNewNode(s[i++]);
    BTP->lchild = CreateTree(s,i,len);
    BTP->rchild = CreateTree(s,i,len);
    return BTP;
    /********** End **********/
}

// 二叉樹的中序周遊
// 參數:二叉樹根節點root
// 輸出:中間沒有空格,末尾不換行。
void InOrder(BTNode* root)
{
    // 請在這裡補充代碼,完成本關任務
    /********** Begin *********/
    if(root==NULL){
        return;
    }
    InOrder(root->lchild);
    printf("%c",root->data);
    InOrder(root->rchild);
    /********** End **********/
}

           

繼續閱讀