二叉樹的創建與中序遍歷


任務描述

本關任務:利用擴展先序遍歷創建二叉樹,並給出相應二叉樹的中序遍歷結果。

相關知識

為了完成本關任務,你需要掌握: 1.二叉樹的先序遍歷 2.如何創建一棵二叉樹 3.二叉樹的中序遍歷 4.二叉樹的二叉鏈表存儲表示。

二叉樹的先序遍歷

先序遍歷(preorder traversal): 1、訪問根結點; 2、先序遍歷左子樹; 3、先序遍歷右子樹。 例:圖1表示一棵二叉樹,先序遍歷的結果為ABCD。 , 圖1 示例二叉樹

如何輸入一棵二叉樹 二叉樹的先序遍歷序列不能夠確定一棵二叉樹的形態,但是若對二叉樹中缺失的孩子結點進行特殊值的補充,再進行先序遍歷,得到擴展的先序遍歷結果,則可以確定一棵二叉樹的形態。 , 圖2 原二叉樹 先序遍歷的結果為:ABCD

, 圖3 擴展二叉樹 擴展先序遍歷的結果為:AB##CD###

如何創建一棵二叉樹 根據先序遍歷的思想: 若根結點為空,則根結點指針為空創建空樹; 否則: (1)創建根結點, (2)先序遍歷創建左子樹; (3)先序遍歷創建右子樹。

二叉樹的中序遍歷

中序遍歷inorder traversal是指按照先左子樹,再根結點,最后右子樹的次序訪問二叉樹中所有的結點,使得每個結點被訪問且僅被訪問一次。 例:圖1表示一棵二叉樹,中序遍歷的結果為BADC。

二叉樹的二叉鏈表存儲表示

  1. typedef char ElemType;
  2. typedef struct BiTNode
  3. { ElemType data;
  4. struct BiTNode *lchild,*rchild;
  5. }BiTNode,*BiTree;

編程要求

在右側編輯器中補充代碼,完成CreateBiTree和InOrder兩個操作函數,以實現二叉樹的創建和中序遍歷。具體要求如下:

  • CreateBiTree:利用先序遍歷創建二叉樹,返回其根指針。
  • InOrder:二叉樹的中序遍歷。

注意:在實現兩個函數的函數體內可調用其他操作。

測試說明

可在右側文件夾中查看step1/Main.cpp文件,以便於你的操作。

平台會對你編寫的代碼進行測試。

輸入輸出說明

輸入為一組測試用例,輸入二叉樹的擴展先序遍歷,‘#’表示空樹,創建該二叉樹的二叉鏈表,並進行輸出其中序遍歷結果。

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

預期輸出: CBDAFE (注意末尾不換行)

 

#include<iostream>
#include<string>
using namespace std;
struct BNode{//二叉樹節點
    BNode(const char d='#'):data(d), left(nullptr), right(nullptr) {};
    char data;
    BNode* left;
    BNode* right;
};
//根據先序遍歷構建一棵二叉樹,返回root指針
BNode* constructBinaryTree(const string& preOrder, unsigned& index){
    if (preOrder.size() == 0 || index == preOrder.size() || preOrder[index] == '#')//若空串或者index超出范圍,則返回空指針
        return nullptr;
    BNode* T = new BNode(preOrder[index++]);
    T->left = constructBinaryTree(preOrder, index);
    T->right = constructBinaryTree(preOrder, ++index);
    return T;
}
//中序遍歷
void inOrder(BNode* T){
    if (T != nullptr){
        inOrder(T->left);
        cout << T->data;
        inOrder(T->right);
    }
}
int main(){
    string str;
    while (cin >> str){
        unsigned index = 0;
        BNode* root = constructBinaryTree(str, index);
        inOrder(root);
        cout << endl;
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM