二叉树的创建 先序 中序 后续 递归和非递归遍历

2024-06-12 02:32

本文主要是介绍二叉树的创建 先序 中序 后续 递归和非递归遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <iostream>
#include <stack>using namespace std;int index = 0;//标记着数组的下标
typedef struct BiTree
{int data;BiTree *lchild;BiTree *rchild;
}*Tree;//创建二叉树,需要使用结构体指针 这样树的结构出了函数 还会保存状态
void createBT(Tree &root,int data[])
{int value = data[index++];if(value == -1){root = NULL;}else{root = new BiTree;root->data = value;createBT(root->lchild,data);createBT(root->rchild,data);}
}
//二叉树的后序遍历 非递归
/**
根据后序遍历的形式 左->右->根,若访问的当前节点的左右孩子为空 就输出其值,要是
访问的当前节点的前驱存在 存在着左右孩子 即访问左右孩子节点 输出值 并将当前节点
至为前驱节点 以便下次访问 若不满足这俩种情况,按照栈的顺序 依次压入右孩子 、左孩子。
*/
void PostOrder(Tree& root)
{BiTree* cur;BiTree* pre = NULL;stack<BiTree*> s;if(root == NULL)return;s.push(root);while(!s.empty()){cur = s.top();if((cur->lchild == NULL && cur->rchild == NULL) ||(pre != NULL &&(pre ==cur->lchild || pre == cur->rchild))){cout << cur->data << " ";s.pop();pre = cur;}else{if(cur->rchild!=NULL)s.push(cur->rchild);if(cur->lchild!=NULL)s.push(cur->lchild);}}cout << endl;
}//后序遍历递归的形式
void visit(Tree&);
void PostOrder_Digui(Tree &root)
{if(root == NULL)return;PostOrder_Digui(root->lchild);PostOrder_Digui(root->rchild);visit(root);
}void visit(Tree &root)
{cout << root->data <<" ";
}//二叉树的先序遍历 递归形式
void PreOrder(Tree& root)
{if(root == NULL)return;visit(root);PreOrder(root->lchild);PreOrder(root->rchild);
}
//先序非递归的形式:
void PreOrder_Fdigui(Tree &root)
{stack<BiTree*> s;if(root == NULL)return;while(root || !s.empty()){while(root){s.push(root);cout << root->data << " ";root = root->lchild;}root = s.top();root = root->rchild;s.pop();}
}
//二叉树的中序遍历 递归的形式
void Inorder_Digui(Tree& root)
{if(root == NULL)return;Inorder_Digui(root->lchild);visit(root);Inorder_Digui(root->rchild);
}
//二叉树中序遍历非递归
void Inorder(Tree &root)
{stack<BiTree*> s;if(root == NULL)return;while(root || !s.empty()){while(root){s.push(root);root = root->lchild;}root = s.top();cout << root->data << " ";root = root->rchild;s.pop();}
}int main()
{int data[] = {8,6,4,-1,-1,7,-1,-1,10,9,-1,-1,11,-1,-1};Tree tree;createBT(tree,data);cout<<"输出树的遍历形式:"<<endl;PostOrder(tree);cout<<"后序递归形式:" << endl;PostOrder_Digui(tree);cout << endl;cout<<"先序遍历递归的形式:"<<endl;PreOrder(tree);cout << endl;cout << "先序非递归的形式:" << endl;PreOrder_Fdigui(tree);out << endl;cout << "中序遍历递归:" << endl;Inorder_Digui(tree);cout << endl;cout << "二叉树的中序遍历非递归形式:"<< endl;Inorder(tree);return 0;
}

这篇关于二叉树的创建 先序 中序 后续 递归和非递归遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

Java 如何创建和使用ExecutorService

《Java如何创建和使用ExecutorService》ExecutorService是Java中用来管理和执行多线程任务的一种高级工具,可以有效地管理线程的生命周期和任务的执行过程,特别是在需要处... 目录一、什么是ExecutorService?二、ExecutorService的核心功能三、如何创建

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.