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

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

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

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

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

剑指offer(C++)--平衡二叉树

题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 class Solution {public:bool IsBalanced_Solution(TreeNode* pRoot) {if(pRoot==NULL)return true;int left_depth = getdepth(pRoot->left);int right_depth = getdepth(pRoot->rig

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

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

一、基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。 性质: 1、非空二叉树的第n层上至多有2^(n-1)个元素。 2、深度为h的二叉树至多有2^h-1个结点。 3、对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。 满二叉树:所有终端都在同一层次,且非终端结点的度数为2。 在满二叉树中若其深度为h,则其所包含

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.

【Qt6.3 基础教程 17】 Qt布局管理详解:创建直观和响应式UI界面

文章目录 前言布局管理的基础为什么需要布局管理器? 盒布局:水平和垂直排列小部件示例:创建水平盒布局 栅格布局:在网格中对齐小部件示例:创建栅格布局 表单布局:为表单创建标签和字段示例:创建表单布局 调整空间和伸缩性示例:增加弹性空间 总结 前言 当您开始使用Qt设计用户界面(UI)时,理解布局管理是至关重要的。布局管理不仅关系到UI的外观,更直接影响用户交互的体验。本篇博

C++ 重建二叉树(递归方法)

/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/#include <vector>class Solution {public:/*** 代码

3_创建Tab控件

1,新建MFC 对话框项目,为对话框添加Tab控件,选中Tab控件,新建控件变量m_tab_ctrl 2,为Tab控件添加tab项 m_tab_ctrl.InsertItem(0, L”000”),参数1,哪个位置;参数2,item的名称 3,为Tab控件添加监听事件, void C测试Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESUL

数据结构:二叉树详解 c++信息学奥赛基础知识讲解

目录 一、二叉树的定义 二、二叉树的形态 三、二叉树的性质 四、二叉树的存储 五、二叉树的创建与遍历(递归) 六、二叉树实现 创建二叉树 展示二叉树 1、计算数的高度 2、计算数的叶子数量 3、计算数的宽度 4、层次遍历 5、前序遍历 递归写法 非递归写法 6、中序遍历 递归写法 非递归写法 7、后序遍历 递归写法 非递归写法 8、输出根节点到所有叶