二叉树的创建与中序遍历
任务描述
本关任务:利用扩展先序遍历创建二叉树,并给出相应二叉树的中序遍历结果。
相关知识
为了完成本关任务,你需要掌握: 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; }