zoukankan      html  css  js  c++  java
  • 二叉树的创建与中序遍历

    任务描述

    本关任务:利用扩展先序遍历创建二叉树,并给出相应二叉树的中序遍历结果。

    相关知识

    为了完成本关任务,你需要掌握: 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;
    }
  • 相关阅读:
    Nginx配置,请求到tomcat中
    读取远程数据库的视图(包括如何连接其他的数据库)
    slf4j日志的使用-学习笔记
    Freemarker生成word文档的时的一些&,>,<报错
    freemarker的replace的使用
    防止表单重复的常用几种方式
    两种表复制语句(SQL)
    总结:如何判断一个对象是否可被回收
    24种设计模式优缺点及适用场景#抽象工厂模式
    24种设计模式优缺点及适用场景#工厂方法模式
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14004377.html
Copyright © 2011-2022 走看看