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

news2024/11/16 5:42:56

目录

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

一、二叉树的结构

在这里插入图片描述

二、二叉树的遍历方式

  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();
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot04:JSR303数据校验及多环境切换

目录 一、JSR303数据校验 1、如何使用&#xff1f; 2、常见参数 二、多环境切换 1、多配置文件 2、yaml的多文档块 3、配置文件加载位置 一、JSR303数据校验 1、如何使用&#xff1f; SpringBoot中可以用Validated来校验数据&#xff0c;如果数据异常则会统一抛出异常…

python篇---统计列表中每个数字的出现次数

python篇—统计列表中每个数字的出现次数 # -*- coding: utf-8 -*- from collections import Counterlst [1, 2, 3, 3, 4, 1, 2, 5, 5, 5] count Counter(lst) print(每个数字在列表中的出现次数&#xff1a;, count) # 再将collections.Counter格式转换成dict print(dict(c…

C# 难点语法讲解之虚方法(virtual)和隐藏方法的区别---从应用需求开始讲解

这里不单独讲虚方法和隐藏方法是什么&#xff0c;很多文章都有讲&#xff0c;这里只讲他们的区别和应用理解。 另外&#xff1a;如果你不懂MonoBehaviour就别管他&#xff0c; Debug.Log就是Console.WriteLine <一>、隐藏方法 一、隐藏方法的背景故事 从前有个了不起…

C++ | 多线程资源抢占bug解决

多线程资源抢占bug解决 文章目录 多线程资源抢占bug解决bug说明原因排查解决经验>>>>> 欢迎关注公众号【三戒纪元】 <<<<< bug说明 最近调试程序&#xff0c;程序在Release版本下可运行&#xff0c;一直没有问题&#xff0c;在Debug模式下编译后…

Leetcode42 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xf…

【javascript】防止内容被复制

在JavaScript中&#xff0c;我们可以使用onselectstart事件来防止页面内容被选取。此时无法选取所要的内容。 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><script>window.onload function() {document.bod…

计算机网络————网络层

文章目录 网络层设计思路IP地址IP地址分类IP地址与硬件地址 协议ARP和RARPIP划分子网和构造超网划分子网构造超网&#xff08;无分类编址CIDR&#xff09; ICMP 虚拟专用网VPN和网络地址转换NATVPNNAT 网络层设计思路 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数…

mysql表中出现特殊符号(逗号,点号),如何进行查询或操作

mysql表中出现特殊符号&#xff08;逗号&#xff0c;点号&#xff09;&#xff0c;如何进行查询或操作 一、背景说明二、需要把表"引"起来&#xff0c;tab键上面的那个按钮&#xff0c;不是引号 一、背景说明 当mysql表名中出现如点号&#xff08;.&#xff09;&…

安装并使用docker

1、安装docker 1.1、更新现有的包列表&#xff1a; sudo apt update 1.2、用apt安装一些允许通过HTTPS才能使用的软件包&#xff1a; sudo apt install apt-transport-https ca-certificates curl software-properties-common 1.3、将官方Docker存储库的GPG密钥添加到您的系统…

二.Elasticsearch进阶

建议从这里开始看&#xff1a;Elasticsearch快速入门及使用 Elasticsearch进阶 一.Elasticsearch检索方式1.uri 检索参数(不常用)2.uri 请求体(常用&#xff0c;也叫Query DSL) 二.Query DSL语法举例1.match全文匹配2.match_phrase短语匹配3.multi_match多字段匹配4.bool复合…

在Gradio中创建交互式代码编辑器:介绍Code模块和其功能

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Matlab评价模型--灰色关联度分析

评价模型–灰色关联度分析 灰色关联度分析 基本思想 灰色关联分析的基本思想 是根据序列曲线几何形状的相似程度来判断其联系是否紧密&#xff0c;曲线越接近&#xff0c;相应序列之间的关联度就越大&#xff0c;反之则越小。 此方法可用于 进行系统分析&#xff0c;也可应用…

uniapp顶部导航栏被遮住显示问题

解决uniapp顶部导航栏被遮住显示问题 uniapp官方给了处理的方案&#xff0c;即css变量&#xff0c;–status-bar-height&#xff0c;小程序这个值是25px&#xff0c;app则根据实际情况去变化 如下&#xff1a; //头部导航栏 <view class"header"> </view…

【算法题】动态规划中级阶段之最长回文子串、括号生成、跳跃游戏

动态规划中级阶段 前言一、最长回文子串1.1、思路1.2、代码实现 二、括号生成2.1、思路2.2、代码实现 三、跳跃游戏 II3.2、思路3.2、代码实现 总结 前言 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种解决多阶段决策过程最优化问题的方法。…

加速你的容器管理!轻松安装kubeadm、kebelet和kubectl!

1 kubernetes镜像切换成国内源 访问 阿里云镜像&#xff1a; M1M2芯片的arm64架构需要更改&#xff1a; cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_6…

Nginx【概述、应用场景、环境准备、下载与安装、目录详解、】(一)-全面详解(学习总结---从入门到深化)

目录 Nginx概述 Nginx 四大应用场景 为什么用Nginx 环境准备 Nginx下载与安装 Nginx目录详解 Nginx概述 Nginx是一款轻量级的Web服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。Ngi…

Linux基础:Vim编辑器实用指南

前言 Linux基础是学习云原生的重中之重&#xff0c;如果你还不知道学习路线可以参考&#xff1a; 耗时3个月&#xff0c;线下访谈30 csdn大佬&#xff0c;规划出了我的云原生学习路线 文章目录 前言vim的介绍vim的四种模式1. 插入模式1.1 进入插入模式&#xff1a;1.2 退出插入…

layui实现选择框搜索(下拉搜索)功能

1.可以使用官方介绍的方法&#xff0c;适用于form表单内的下拉搜索&#xff0c;外层需要使用layui-form样式&#xff0c;select标签内添加lay-search“”&#xff0c;此方法若外层不添加layui-form无法实现搜索功能&#xff0c;如下所示&#xff1a; 2.下面是另一种形式的下拉选…

【GESP】2023年06月图形化一级 -- 小猫寻宝

文章目录 小猫寻宝1. 准备工作2. 功能实现3. 设计思路与实现&#xff08;1&#xff09;角色、舞台背景设置a. 角色设置b. 舞台背景设置 &#xff08;2&#xff09;脚本编写a. 角色&#xff1a;Catb. 角色&#xff1a;Crystal 4. 评分标准 小猫寻宝 1. 准备工作 &#xff08;1&…

kafka生产者api和数据操作

Kafka 生产者 发送流程 消息发送过程中涉及到两个线程——main线程和Sender线程 main线程 使用serializer&#xff08;并非java默认&#xff09;序列化数据&#xff0c;使用partitioner确认发送分区 在main线程中创建了一个双端队列RecordAccumulator&#xff0c;main线程将…