树的四种遍历C/C++实现

2023-10-27

树的四种遍历C/C++实现

备考期末,懂得都懂,手敲遍代码;
比较懒,都是递归形式

结构定义

typedef char ElemType;
typedef struct BiNode{
    ElemType data;
    struct BiNode *lchild, *rchild;
} BiTNode, *BiTree;

先序创建树

void CreateBiTree(BiTree &T){
    ElemType ch;
    cin >> ch;
    if(ch == '#')  T = NULL;
    else {
        T = new BiNode;
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}

先序遍历

void PreOrderTraverse(BiTree &T){
    if(!T) return ;
    cout << T->data << " ";
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

中序遍历

void InOrderTraverse(BiTree &T){
    if(!T) return ;
    InOrderTraverse(T->lchild);
    cout << T->data << " ";
    InOrderTraverse(T->rchild);
}

后序遍历

void PostOrderTraverse(BiTree &T){
    if(!T) return ;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    cout << T->data << " ";
}

层次遍历

void LeverOrderTraverse(BiTree &T){
    queue<BiTree> Tree;
    BiTree sNode = T;
    Tree.push(sNode);
    while(!Tree.empty()){
        sNode = Tree.front();
        Tree.pop();
        cout<< sNode->data << " ";
        if(sNode->lchild) Tree.push(sNode->lchild);
        if(sNode->rchild) Tree.push(sNode->rchild);
    }
}

总代码 (给懒人下载运行用)

#include <iostream>
#include <queue>
using namespace std;

typedef char ElemType;
typedef struct BiNode{
    ElemType data;
    struct BiNode *lchild, *rchild;
} BiTNode, *BiTree;
// 先序创建树
void CreateBiTree(BiTree &T){
    ElemType ch;
    cin >> ch;
    if(ch == '#')  T = NULL;
    else {
        T = new BiNode;
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
// 先序遍历
void PreOrderTraverse(BiTree &T){
    if(!T) return ;
    cout << T->data << " ";
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}
// 中序遍历
void InOrderTraverse(BiTree &T){
    if(!T) return ;
    InOrderTraverse(T->lchild);
    cout << T->data << " ";
    InOrderTraverse(T->rchild);
}
// 后序遍历
void PostOrderTraverse(BiTree &T){
    if(!T) return ;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    cout << T->data << " ";
}
// 层次遍历
void LeverOrderTraverse(BiTree &T){
    queue<BiTree> Tree;
    BiTree sNode = T;
    Tree.push(sNode);
    while(!Tree.empty()){
        sNode = Tree.front();
        Tree.pop();
        cout<< sNode->data << " ";
        if(sNode->lchild) Tree.push(sNode->lchild);
        if(sNode->rchild) Tree.push(sNode->rchild);
    }
}

int main(){
    BiTree tree;
    CreateBiTree(tree);
    PreOrderTraverse(tree);
    cout << endl;
    InOrderTraverse(tree);
    cout << endl;
    PostOrderTraverse(tree);
    cout << endl;
    LeverOrderTraverse(tree);
    cout << endl;

    cin.get();
    cin.get();
    return 0;
}

运行示例

1 2 4 # # 5 # # 3 # 6 7 # # #
1 2 4 5 3 6 7
4 2 5 1 3 7 6
4 5 2 7 6 3 1
1 2 3 4 5 6 7

输入测试数据:

1 2 4 # # 5 # # 3 # 6 7 # # #

运行结果:

1 2 4 5 3 6 7
4 2 5 1 3 7 6
4 5 2 7 6 3 1
1 2 3 4 5 6 7
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树的四种遍历C/C++实现 的相关文章

随机推荐

  • python:字典

    字典是是无序的键值对 key value 集合 同一个字典内的键必须是互不相同的 一对大括号 创建一个空字典 1 使用 del 关键字删除任意指定的键值对 2 使用 in 关键字查询指定的键是否存在于字典中 字典中的键必须是不可变类型 3
  • hmailserver邮件收不了邮件

    按下面步骤查看 首先就要把dns域名的mx记录配置好才能从别的邮件服务器接到邮件 域名 domain com的记录 http www hmailserver com documentation latest page ts receive
  • 【SpringBoot】整合Spring JDBC操作数据

    一 jdbc简介 JDBC Java DataBase Connectivity java数据库连接 是一种用于执行SQL语句的Java API 可以为多种关系数据库提供统一访问 它由一组用Java语言编写的类和接口组成 JDBC提供了一种
  • 《30天自制操作系统》入门方法总结

    30天自制操作系统 是一位日本大佬 川合秀实 老师所写的一本书 逻辑清晰 语言朴实 我跟着中文版的电子书学习了两天 感觉很好 在这里我就实操环节简单做一下总结 以帮助初学者更好的入门 1 操作系统和编辑器 我使用的是win10 64位 专业
  • 关联规则算法(Apriori算法、FP-Growth算法)小案例(python mlxtend)

    目录 一 Apriori 二 FP Growth 一 Apriori 算法理论部分参考 28条消息 Apriori算法与FP Tree算法 messi james的博客 CSDN博客 import pandas as pd 构造数据集 it
  • Unity打包安装包时出现CommandInvokationFailure: Gradle build failed.

    Unity打包安卓安装包时出现CommandInvokationFailure Gradle build failed 我首先是上网百度了一下 看到有许多方法 其中有人这样说 教训是 出现报错 不要上来就上网寻找答案 大家配置不一样 适合别
  • EMD(经验模态分解)算法 二

    上次基本搞懂了怎么用各种滤波器 这次重点看看EMD的算法应用 怎么调参数以产生不同的分解波形 EMD经验模态分解 emd lt as data frame emd xt diff load Load boundary wave stopru
  • 三进制计算机_一分钟基础:计算机为什么采用二进制?

    这是博主新想到的一个点子 旨在用最短的篇幅介绍知识 积少成多 希望朋友们能够有所收获 另外 最近事情属实太多 鸽了一个多月 感谢各位朋友没取关 我真不是在提醒各位取关 等忙完这段 希望自己也能做一个日更博主2333 PS 我改名了 最高权限
  • 请你说说instanceof 与 typeof的区别

    为什么 null instanceof Object是false 而typeof null是Object 在 JavaScript 中 null instanceof Object 的结果是 false 这是因为 null 是一个特殊的原始
  • android安卓开发调试经验

    android安卓开发调试经验 在哪查看错误信息 Run Console LogCat 常见错误 网络问题 检查权限
  • 【千律】C++基础:通过函数实现数据交换--指针方案

    include
  • 链表求和

    I 问题描述 你有两个用链表代表的整数 其中每个节点包含一个数字 数字存储按照在原来整数中相反的顺序 使得第一个数字位于链表的开头 写出一个函数将两个整数相加 用链表形式返回和 给出两个链表 3 gt 1 gt 5 gt null
  • RTT-移植Nano

    RTT 移植Nano 一 准备工作 STM32F103模板工程 RTT nano源码 https www rt thread org document site rt thread version rt thread nano an0038
  • Spring源码深度解析:九、bean的获取③ - createBeanInstance

    一 前言 文章目录 Spring源码深度解析 文章目录 createBeanInstance 的流程图如下 让我们根据流程图一步一步的学习一下spring是如何创建bean的吧 这篇文章是接着 Spring源码深度解析 八 bean的获取
  • 基于TensorFlow的CNN卷积网络模型花卉分类(1)

    一 项目描述 使用TensorFlow进行卷积神经网络实现花卉分类的项目 加载十种花分类 建立模型后进行预测分类图片 环境 win10 TensorFlow gpu 1 12 0 pycharm 训练集 训练数据存放路径为 D LearnM
  • 用bat批量重命名不同文件夹下的同名文件

    起因 手机B站离线的视频目录是这个样子的 视频的每一个分P都会生成一个文件夹 包含视频基本资料和一个名为80的文件夹 这个文件夹里放着后缀名为m4s的音频和视频文件 现需要使用电脑播放下载的视频 那么第一步就是更改视频和音频文件的后缀名 百
  • 防火墙总结

    一 什么是防火墙 防火墙分为软件防火墙和硬件防火墙 他们的优缺点 硬件防火墙 拥有经过特别设计的硬件及芯片 性能高 成本高 当然硬件防火墙也是有软件的 只不过有部分功能由硬件实现 所以硬件防火墙其实是硬件 软件的方式 软件防火墙 应用软件处
  • Failed to load module “canberra-gtk-module“ 或 Using GTK+ 2.x and GTK+ 3 in the same process is not

    项目场景 ubuntu安装matlab之后 运行时报错Failed to load module canberra gtk module 如下 原因分析 未安装Matlab运行所需要的依赖 执行如下命令 sudo apt get insta
  • 深入浅出UML类图(二)

    类与类之间的关系 1 在软件系统中 类并不是孤立存在的 类与类之间存在各种关系 对于不同类型的关系 UML提供了不同的表示方式 1 关联关系 关联 Association 关系是类与类之间最常用的一种关系 它是一种结构化关系 用于表示一类对
  • 树的四种遍历C/C++实现

    树的四种遍历C C 实现 树的四种遍历C C 实现 结构定义 先序创建树 先序遍历 中序遍历 后序遍历 层次遍历 总代码 给懒人下载运行用 运行示例 树的四种遍历C C 实现 备考期末 懂得都懂 手敲遍代码 比较懒 都是递归形式 结构定义