二叉树三种遍历方式及其实现

2024-06-24 11:38

本文主要是介绍二叉树三种遍历方式及其实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基本概念

每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。

性质:

1、非空二叉树的第n层上至多有2^(n-1)个元素。

2、深度为h的二叉树至多有2^h-1个结点。

3、对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。

满二叉树:所有终端都在同一层次,且非终端结点的度数为2。

在满二叉树中若其深度为h,则其所包含的结点数必为2^h-1。

完全二叉树:除了最大的层次即成为一颗满二叉树且层次最大那层所有的结点均向左靠齐,即集中在左面的位置上,不能有空位置。

对于完全二叉树,设一个结点为i则其父节点为i/2,2i为左子节点,2i+1为右子节点。

二、二叉树的遍历
遍历二叉树的所有结点且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。


前序遍历:根节点->左子树->右子树(根节点在前面

中序遍历:左子树->根节点->右子树根节点在中间

后序遍历:左子树->右子树->根节点根节点在后边

例如:求下面树的三种遍历

 

前序遍历:abdefgc

中序遍历:debgfac

后序遍历:edgfbca

三、二叉树三种遍历方式的六种实现方法

#include <iostream>  
#include <string>  
#include <stack>  
#include <vector>  
using namespace std;  
struct Node  
{  int val;  Node * left;  Node * right;  Node(int x) :val(x), left(nullptr), right(nullptr){};  
};  void creatBiTree(Node * &root)  
{  int x;  cin >> x;  if (x == -1)  {  root = nullptr;  return;  }  root = new Node(x);  creatBiTree(root->left);  creatBiTree(root->right);  
}  
void visit(Node *T)  
{  if (T->val != -1)  cout << T->val << " ";  }  
/**递归方式遍历**/  
//先序递归遍历  
void preOrder(Node * root)  
{  if (root != nullptr)  {  visit(root);  preOrder(root->left);  preOrder(root->right);  }  
}  
//中序递归遍历  
void inOrder(Node * root)  
{  if (root != nullptr)  {  inOrder(root->left);  visit(root);  inOrder(root->right);  }  
}  
//后序递归遍历  
void postOrder(Node * root)  
{  if (root != nullptr)  {  postOrder(root->left);  postOrder(root->right);  visit(root);  }  
}  
/**非递归方式遍历**/  
//先序遍历  
void preOrderF(Node * root)  
{  if (root == nullptr)  return;  stack<Node *> s;  s.push(root);  Node *p = nullptr;  while (!s.empty())  {  p = s.top();  s.pop();  cout << p->val << " ";  if (p->right)  s.push(p->right);  if (p->left)  s.push(p->left);  }  
}  
//中序遍历  
void inOrderF(Node * root)  
{  if (root == nullptr)  return;  stack<Node *> s;  Node *p = root;  while (p||!s.empty())  {  if (p)  {  s.push(p);  p = p->left;  }  else   {  p = s.top();  s.pop();  cout << p->val << " ";  p = p->right;  }  }  }  
//后序遍历  
void postOrderF(Node * root)  
{  if (root == nullptr)  return;  stack<Node *> s;  vector<int> rs;  s.push(root);  Node *p = nullptr;  while (!s.empty())  {  p = s.top();  s.pop();  rs.insert(rs.begin(),p->val);  if (p->left)  s.push(p->left);  if (p->right)  s.push(p->right);  }  for (int i = 0; i < rs.size(); i++)  cout << rs[i] << " ";  
}  
int _tmain(int argc, _TCHAR* argv[])  
{  Node * root;  //二叉树的创建(根据先序创建)  creatBiTree(root);  //二叉树的递归遍历  preOrderF(root);  cout << endl;  inOrderF(root);  cout << endl;  postOrderF(root);  cout << endl;  return 0;  
}  


这篇关于二叉树三种遍历方式及其实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090045

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

如何突破底层思维方式的牢笼

我始终认为,牛人和普通人的根本区别在于思维方式的不同,而非知识多少、阅历多少。 在这个世界上总有一帮神一样的人物存在。就像读到的那句话:“人类就像是一条历史长河中的鱼,只有某几条鱼跳出河面,看到世界的法则,但是却无法改变,当那几条鱼中有跳上岸,进化了,改变河道流向,那样才能改变法则。”  最近一段时间一直在不断寻在内心的东西,同时也在不断的去反省和否定自己的一些思维模式,尝试重

idea lanyu方式激活

访问http://idea.lanyus.com/这个地址。根据提示将0.0.0.0 account.jetbrains.com添加到hosts文件中,hosts文件在C:\Windows\System32\drivers\etc目录下。点击获得注册码即可。

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

以canvas方式绘制粒子背景效果,感觉还可以

这个是看到项目中别人写好的,感觉这种写法效果还可以,就存留记录下 就是这种的背景效果。如果想改背景颜色可以通过canvas.js文件中的fillStyle值改。 附上demo下载地址。 https://download.csdn.net/download/u012138137/11249872