当前位置: 首页 > news >正文

数据结构-二叉链表存储的二叉树

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树,称其为二叉树。二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:

而二叉树的前序、中序遍历是非常重要的能够访问二叉树所有结点的算法,下面分别列出一种先序遍历和两种中序遍历的算法。

二叉链表存储的二叉树1

第一种中序遍历的方法(算法6.3):

二叉链表存储的二叉树2

第二种中序遍历的方法(算法6.2):

二叉链表存储的二叉树3

通过读入一个字符串,建立二叉树的算法如下:

二叉链表存储的二叉树4

在本题中,将会给出一个按照先序遍历得出的字符串,空格代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并按照题目描述中的一种先序遍历和两种中序遍历的算法分别输出每一个非空节点。

输入格式

输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。

输出格式

共有三行,每一行包含一串字符,表示分别按先序、中序、中序得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。

样例输入

ABC  DE G  F   

样例输出

A B C D E G F 
C B E G D F A 
C B E G D F A 
#include <complex.h>
#include<iostream>
#include<stack>
using namespace std;

stack<char>s;
struct BiNode {
    char data;
    BiNode *left,*right;
};

void BuildTree(BiNode** T) {
    char ch;
    ch = getchar();
    if (ch==' ') {
        *T = NULL;
        return;
    }
    else {
        *T = (BiNode*)malloc(sizeof(BiNode));
        (*T)->data=ch;
        BuildTree(&(*T)->left);
        BuildTree(&(*T)->right);
    }
}
void PreOrder(BiNode* T) {
    auto p = T;
    if (p!=NULL) {
        cout<<p->data<<' ';
        PreOrder(p->left);
        PreOrder(p->right);
    }
    else {
        return;
    }
}
void InOrder(BiNode*T) {
    auto p = T;
    if (p!=NULL) {
        InOrder(p->left);
        cout<<p->data<<' ';
        InOrder(p->right);
    }
    else {

        return;
    }
}
void InOrder2(BiNode*T) {
    auto p = T;
    stack<BiNode*>s;
    do {
        while (p) {
            s.push(p);
            p = p->left;
        }
        if (!s.empty()) {
            cout<<s.top()->data<<' ';
            p = s.top();
            s.pop();
            p = p->right;
        }
    }while ((!s.empty())||p);
}
int main()
{
    BiNode* T;
    BuildTree(&T);
    PreOrder(T);cout<<endl;
    InOrder(T);cout<<endl;
    InOrder2(T);cout<<endl;
    return 0;
}

相关文章:

  • 在 Simulink 里构建输水隧洞充水过程模型的基本步骤与思路
  • 人工智能之数学基础:广义特征值和广义特征向量是什么?
  • 【2025】基于springboot+vue的学习预警管理系统的设计与实现(源码、万字文档、图文修改、调试答疑)
  • 【前端实战】程序员版合成大西瓜游戏开发全解析 —— HTML5+JS打造趣味物理小游戏(附完整源码)
  • 金橙子删除打标对象
  • 手动配置树莓派wifi联网连接热点手机热点
  • MyBatis-Plus(Ⅲ)IService详解
  • Day 4
  • 链表的中间结点
  • Python----计算机视觉处理(Opencv:梯度处理:filiter2D算子,Sobel,Laplacian)
  • react中useRef和useMemo和useCallback
  • 常见框架漏洞--Spring
  • 部署Tomcat及jdk
  • Redis Sentinel 详解
  • linux的权限管理
  • 在 ASP.NET Core 中实现限流(Rate Limiting):保护服务免受滥用与攻击
  • Flask接口开发--POST接口
  • Linux(8.5)FTP
  • win32汇编环境,网络编程入门之十
  • C++实现决策树与随机森林调优困境:从性能瓶颈到高效突破
  • 言短意长|如何看待“订不到酒店的游客住进局长家”这件事
  • 2025五一档电影票房破6亿
  • 日本来信|劳动者的书信④
  • 人民日报头版:让青春之花绽放在祖国和人民最需要的地方
  • 俄罗斯期望乌克兰在停火期间采取行动缓和局势
  • 辛涛任山东第一医科大学副校长,曾为“博士服务团”成员