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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记事本软件误删后如何找回?

随着智能手机的普及&#xff0c;各种优秀的手机软件层出不穷&#xff0c;成为我们生活和工作中的得力助手。其中&#xff0c;记事本软件在手机上的应用也越来越受欢迎。 一款记事本可以给用户带来许多便利和帮助。与传统的纸质记事本相比&#xff0c;手机记事本具有更多的功能…

mac ppt设置起始页码

今天发现我的ppt的左边ppt的缩略图的开始页码是从2开始的&#xff0c;觉得很奇怪&#xff0c;这个解决的办法就是 点击ppt->文件->页面设置->页眉和页脚->幻灯片编号

SQL注入攻击与防护

目录 一、SQL注入攻击概述 1.1 SQL注入概念 1.1.1 标准查询过程 1.1.2 SQL注入定义 1.2 SQL注入根本原因 1.3 SQL注入条件 1.4 SQL注入防范 1.4.1 根本原因&#xff1a;过滤不严 1.4.2 安全设计原则&#xff1a;数据与代码分离 1.5 SQL注入流程 1.6 SQL注入分类 1.…

时序预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)时间序列预测

时序预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)时间序列预测 目录 时序预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)时间序列预测预测效果基本介绍模型介绍PSO模型LSTM模型PSO-LSTM模型 程序设计参考资料致谢 预测效果 基本介绍 Matlab基于PSO-LST…

Java日志框架介绍

​今天来聊一聊 Java 日志框架&#xff0c;不管是在项目开发阶段的调试&#xff0c;还是项目上线后的运行&#xff0c;都离不开日志。日志具有处理历史数据、定位程序问题、理解程序运行过程等重要作用。在 Spring 项目开发过程中我们常见的日志框架可能就是 logback、log4j2 和…

数据库的操作

前言 在之前的文章中&#xff0c;我们已经了解了什么是数据库&#xff0c;以及为什么有数据库&#xff0c;和数据库有什么作用&#xff0c;有了这些宏观概念之后&#xff0c;本章为大家进一步详细介绍对于数据库在Linux上如何具体操作。 1.创建数据库 1.1创建数据库语法 语法…

MyBatis-Plus:条件构造器Wrapper

目录 1.Wrapper概述 1.1.Wrapper的继承关系 1.2.Wapper介绍 1.3.各个构造器使用区别 1.4.构造器常用方法 2.Wrapper常用构造器介绍 2.1.QueryWrapper 2.2.UpdateWrapper 2.3.LambdaQueryWrapper 2.4.AbstractWrapper 3. Lambda条件构造器 3.1.示例 4.鸣谢 MyBati…

Spring Boot 如何使用 Spring Security 进行认证和授权

Spring Boot 如何使用 Spring Security 进行认证和授权 在 Web 应用程序中&#xff0c;认证和授权是非常重要的功能。Spring Security 是一个基于 Spring 框架的强大的安全框架&#xff0c;它提供了完整的认证和授权解决方案&#xff0c;并且可以轻松地集成到 Spring Boot 应用…

服务器编程:数据库连接池

引言&#xff1a; 数据库连接池和线程池的思想一样&#xff0c;是为了避免频繁创建和销毁数据库连接导致的性能开销。如果一个项目频繁的需要访问数据库&#xff0c;那么它就有可能需要频繁的创建/销毁数据库连接&#xff0c;那么我们可以采用数据库连接池的技术&#xff0c;在…

【几何数学】【Python】【C++】将线段沿着线段方向延长一定长度,求新的点

p1点和p2点是一条线段的两端&#xff0c;沿着p1指向p2的方向&#xff0c;将线段长度延伸长度x&#xff0c;求延伸后的点ep。如下图&#xff1a; Python代码&#xff1a; import mathdef extend_line_segment(p1, p2, extension_length):"""延伸线段长度并返回…

Redis各数据类型操作命令

一、Redis数据类型及命令 &#xff08;一&#xff09;String 类别命令描述命令示例备注取/赋值操作赋值set key valueset lclkey lclvalue取值 get keyget lclkey取值并赋值getset key valuegetset lclkey1 lclvalue1获取原值&#xff0c;并设置新的值仅当不存在时赋值setnx k…

多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% …