任務描述
本關任務:利用擴展先序遍歷創建二叉樹,並給出相應二叉樹的中序遍歷結果。
相關知識
為了完成本關任務,你需要掌握: 1.二叉樹的先序遍歷 2.如何創建一棵二叉樹 3.二叉樹的中序遍歷 4.二叉樹的二叉鏈表存儲表示。
二叉樹的先序遍歷
先序遍歷(preorder traversal): 1、訪問根結點; 2、先序遍歷左子樹; 3、先序遍歷右子樹。 例:圖1表示一棵二叉樹,先序遍歷的結果為ABCD。
圖1 示例二叉樹
如何輸入一棵二叉樹 二叉樹的先序遍歷序列不能夠確定一棵二叉樹的形態,但是若對二叉樹中缺失的孩子結點進行特殊值的補充,再進行先序遍歷,得到擴展的先序遍歷結果,則可以確定一棵二叉樹的形態。
圖2 原二叉樹 先序遍歷的結果為:ABCD
圖3 擴展二叉樹 擴展先序遍歷的結果為:AB##CD###
如何創建一棵二叉樹 根據先序遍歷的思想: 若根結點為空,則根結點指針為空創建空樹; 否則: (1)創建根結點, (2)先序遍歷創建左子樹; (3)先序遍歷創建右子樹。
二叉樹的中序遍歷
中序遍歷inorder traversal是指按照先左子樹,再根結點,最后右子樹的次序訪問二叉樹中所有的結點,使得每個結點被訪問且僅被訪問一次。 例:圖1表示一棵二叉樹,中序遍歷的結果為BADC。
二叉樹的二叉鏈表存儲表示
typedef char ElemType;typedef struct BiTNode{ ElemType data;struct BiTNode *lchild,*rchild;}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; }
