【C++实现二叉树的遍历】

目录

  • 一、二叉树的结构
  • 二、二叉树的遍历方式
  • 三、源码

一、二叉树的结构

在这里插入图片描述

二、二叉树的遍历方式

  1. 先序遍历: 根–>左–>右
  2. 中序遍历: 左–>根–>右
  3. 后序遍历:左–>右–>根
  4. 层次遍历:顶层–>底层

三、源码

注:关于二叉树中先序、中序和后序遍历算法的实现暂时只用了递归方式,后去会补充非递归的实现方式。

/*
    本项目主要用于二叉树的基础遍历算法测试。
    1.binarytree.h包含对二叉树的结构体定义以及二叉树的先序、中序、后序以及层次遍历。
    2.binarytree.cpp包含对各个遍历算法的实现。
    3.main.cpp包含了对于二叉树遍历算法的测试。
*/

binarytree.h

#ifndef BINARYTREE_H
#define BINARYTREE_H

#include <QObject>

// 二叉树结点定义
struct TreeNode {
    int data;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int val) : data(val), left(nullptr), right(nullptr) {}
};

// 二叉树类
class BinaryTree : public QObject{
    Q_OBJECT
public:
    TreeNode* root;

    int seq;

public:
    BinaryTree();
    /* 二叉树节点插入 */
    void insertNode(int val);
    /* 初始化二叉树 */
    void initBinaryTree();
    /* 二叉树先序遍历 */
    void preOrderTravel(TreeNode* node);
    /* 二叉树中序遍历 */
    void inOrderTravel(TreeNode* node);
    /* 二叉树后序遍历 */
    void postOrderTravel(TreeNode* node);
    /* 二叉树层次遍历 */
    void levelOrderTravel();
};

#endif // BINARYTREE_H

binarytree.cpp

#include "binarytree.h"
#include <iostream>
#include <queue>

using namespace  std;

BinaryTree::BinaryTree()
{
    root = nullptr;
    seq = 0;
}
// 插入结点
void BinaryTree::insertNode(int val) {
    TreeNode* newNode = new TreeNode(val);

    if (root == nullptr) {
        root = newNode;
        return;
    }

    TreeNode* curr = root;
    while (true) {
        if (val < curr->data) {
            if (curr->left == nullptr) {
                curr->left = newNode;
                break;
            } else {
                curr = curr->left;
            }
        } else {
            if (curr->right == nullptr) {
                curr->right = newNode;
                break;
            } else {
                curr = curr->right;
            }
        }
    }
}

void BinaryTree::initBinaryTree()
{
    int _data[7] = {4,2,6,1,3,5,7};
    cout<<"初始化节点序列:";
    for(int i = 0;i < 7;i ++)
    {
        insertNode(_data[i]);
        cout<<_data[i]<<" ";
    }
    cout<<endl;
}

void BinaryTree::preOrderTravel(TreeNode *node)
{
    if (node == nullptr)
        return;
    cout<<"第"<<seq++<<"个节点:"<<node->data<<endl;

    if(node->left != nullptr)
        preOrderTravel(node->left);

    if(node->right != nullptr)
        preOrderTravel(node->right);
}

void BinaryTree::inOrderTravel(TreeNode *node)
{
    if (node == nullptr)
        return;
    if(node->left != nullptr)
        inOrderTravel(node->left);

    cout<<"第"<<seq++<<"个节点:"<<node->data<<endl;

    if(node->right != nullptr)
        inOrderTravel(node->right);
}

void BinaryTree::postOrderTravel(TreeNode *node)
{
    if (node == nullptr)
        return;
    if(node->left != nullptr)
        postOrderTravel(node->left);

    if(node->right != nullptr)
        postOrderTravel(node->right);

    cout<<"第"<<seq++<<"个节点:"<<node->data<<endl;
}

void BinaryTree::levelOrderTravel()
{
    if (root == nullptr)
        return;
    queue<TreeNode*> _q;
    _q.push(root);

    while(!_q.empty())
    {
        TreeNode* child = _q.front();
        cout<<"第"<<seq++<<"个节点:"<<child->data<<endl;
        _q.pop();
        if(child->left != nullptr)
            _q.push(child->left);

        if(child->right != nullptr)
            _q.push(child->right);

    }
    cout<<endl;
}

main.cpp

#include <QCoreApplication>
#include <iostream>
#include <binarytree.h>

using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    BinaryTree *mTree = new BinaryTree;

    cout<<"开始初始化二叉树!"<<endl;
    mTree->initBinaryTree();//初始化二叉树

    cout<<"开始执行二叉树的先序遍历!"<<endl;
    mTree->preOrderTravel(mTree->root);
    mTree->seq = 0;

    cout<<"开始执行二叉树的中序遍历!"<<endl;
    mTree->inOrderTravel(mTree->root);
    mTree->seq = 0;

    cout<<"开始执行二叉树的后序遍历!"<<endl;
    mTree->postOrderTravel(mTree->root);
    mTree->seq = 0;

    cout<<"开始执行二叉树的层次遍历!"<<endl;
    mTree->levelOrderTravel();

    delete mTree;
    mTree = nullptr;
    return a.exec();
}

效果如下图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32989.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云原生监控平台 Prometheus 从部署到监控

1.监控系统架构设计 角色 节点 IP地址 监控端 Prometheus &#xff0c;Grafana&#xff0c;node_exporter &#xff0c;Nginx 47.120.35.251 被监控端1 node_exporter 47.113.177.189 被监控端2 mysqld_exporter&#xff0c;node_exporter&#xff0c;Nginx&#xff…

ivx低代码开发平台

前言 低代码开发平台&#xff08;Low-Code Development Platform, LCDS&#xff09;为企业和开发者提供了高效的应用开发方式。在2023年&#xff0c;中国的低代码开发平台正在快速发展&#xff0c;以下是其中最受关注的十大平台&#xff1a; iVX&#xff1a;iVX是一款新型的低代…

react总结

一、React 入门 1.1 特点 高性能、声明式、组件化、单向响应的数据流、JSX扩展、灵活 1.2 React初体验 <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&quo…

跨越时空限制,酷暑天气用VR看房是一种什么体验?

近年来&#xff0c;全球厄尔尼诺现象越来越频繁&#xff0c;夏季温度不断创下新高&#xff0c;持续大范围的高温天气让人们对出门“望而生畏”。很多购房者也不愿意在如此酷暑期间&#xff0c;四处奔波看房&#xff0c;酷暑天气让带看房效率大大降低&#xff0c;更有新闻报道&a…

VSCode+GDB+Qemu调试ARM64 linux内核

俗话说&#xff0c;工欲善其事 必先利其器。linux kernel是一个非常复杂的系统&#xff0c;初学者会很难入门。 如果有一个方便的调试环境&#xff0c;学习效率至少能有5-10倍的提升。 为了学习linux内核&#xff0c;通常有这两个需要 可以摆脱硬件&#xff0c;方便的编译和…

基于open62541库的OPC UA协议节点信息查询及多节点数值读写案例实践

目录 一、OPC UA协议简介 二、open62541库简介 三、 opcua协议的多点查询、多点读写案例服务端opcua_server 3.1 opcua_server工程目录 3.2 程序源码 3.3 工程组织文件 3.4 编译及启动 四、opcua协议的多点查询、多点读写案例客户端opcua_client 4.1 opcua_client工程目录 4…

使用 Jetpack Compose 构建 Spacer

欢迎阅读本篇关于如何使用 Jetpack Compose 构建 Spacer 的博客。Jetpack Compose 是 Google 的现代 UI 工具包&#xff0c;主要用于构建 Android 界面。其声明式的设计使得 UI 开发更加简洁、直观。 一、什么是 Spacer&#xff1f; 在 UI 设计中&#xff0c;我们通常需要在不…

CSS之平面转换

简介 作用&#xff1a;为元素添加动态效果&#xff0c;一般与过渡配合使用 概念&#xff1a;改变盒子在平面内的形态&#xff08;位移、旋转、缩放、倾斜&#xff09; 平面转换也叫 2D 转换&#xff0c;属性是 transform 平移 transform: translate(X轴移动距离, Y轴移动距…

【SpringCloud——Elasticsearch(下)】

一、数据聚合 聚合&#xff0c;可以实现对文档数据的统计、分析、运算。常见的聚合有三类&#xff1a; ①、桶聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组。Date Histogram&#xff1a;按照日期解题分组&#xff0c;例如一周为一组&am…

javaee sql注入问题

jsp页面 <% page language"java" contentType"text/html; charsetutf-8"pageEncoding"utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> &…

QT树的实现

理论 在Model/View结构中&#xff0c;数据模型为视图组件和代理组件提供存取数据的标准接口。在QT中&#xff0c;所有的数据模型类都从QAbstactItemModel继承而来&#xff0c;不管底层的数据结构是如何组织数据的&#xff0c;QAbstractItemModel的子类都以表格的层次结构表示数…

大数据需要一场硬件革命

光子盒研究院 计算领域的进步往往集中在软件上&#xff1a;华丽的应用程序和软件可以跟踪人和生态系统的健康状况、分析大数据&#xff0c;并在智力竞赛中击败人类冠军。与此同时&#xff0c;对支撑所有这些创新的硬件进行全面改革的努力相对来说&#xff0c;略显小众。 自2020…

Scala里的WordCount 案例

7.7.5 普通 WordCount 案例 package chapter07object TestWordCount__简单版 {def main(args: Array[String]): Unit {//单词计数&#xff1a;将集合中出现的相同单词计数&#xff0c;进行计数&#xff0c;取计数排名的前三的结果val stringList List("Hello Scala Hbas…

【数据可视化方案分享】电商数据分析

本文所分享的电商数据分析报表均来自奥威BI软件的电商数据分析方案&#xff01;该方案是一套包含数据采集、数据建模、数据分析报表的系统化、标准化数据分析方案&#xff0c;下载套用&#xff0c;立见效果&#xff01; 注意&#xff0c;奥威BI软件的电商数据分析方案分两类&a…

【基于Django框架的在线教育平台开发-01】账号登录及退出登录功能开发

文章目录 1 模型层开发2 视图层开发3 form表单验证4 配置urls.py5 模板层开发6 效果展示 1 模型层开发 用户数据表如下所示&#xff1a; FieldTypeExtraidintPrime Key & Auto Incrementpasswordvarchar(128)last_logindatetime(6)Allow Nullis_superusertinyint(1)usern…

mysql 常见锁类型

表锁 & 行锁 在 MySQL 中锁的种类有很多&#xff0c;但是最基本的还是表锁和行锁&#xff1a;表锁指的是对一整张表加锁&#xff0c;一般是 DDL 处理时使用&#xff0c;也可以自己在 SQL 中指定&#xff1b;而行锁指的是锁定某一行数据或某几行&#xff0c;或行和行之间的…

第二章 数据处理篇:transforms

教程参考&#xff1a; https://pytorch.org/tutorials/ https://github.com/TingsongYu/PyTorch_Tutorial https://github.com/yunjey/pytorch-tutorial 详细的transform的使用样例可以参考&#xff1a;ILLUSTRATION OF TRANSFORMS 文章目录 为什么要使用transformstransforms方…

二叉树题目:单值二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;单值二叉树 出处&#xff1a;965. 单值二叉树 难度 3 级 题目描述 要求 如果二叉树每个结点都具有相同的值&am…

SQL死锁

目录 前言&#xff1a; 分析&#xff1a; 死锁产生的原因&#xff1a; sql死锁 模拟&#xff1a; 解决办法&#xff1a; (本质&#xff1a;快速筛选或高效处理、以此减少锁冲突) ①大事务拆成小事务&#xff0c;尽可能缩小事务范围 大事务:将多个操作放在一个事务中执行…

【MOOC 测验】第5章 链路层

1、局域网的协议结构一般不包括&#xff08; &#xff09; A. 数据链路层B. 网络层C. 物理层D. 介质访问控制层 逻辑链路控制子层、介质访问控制子层、物理层 2、下列关于二维奇偶校验的说法&#xff0c;正确的是&#xff08; &#xff09; A. 可以检测和纠正双比特差错B…