当前位置: 首页 > news >正文

后序非递归遍历二叉树

要实现一个后序非递归遍历二叉树的算法。后序遍历的顺序是先遍历左子树,然后遍历右子树,最后访问根节点。

第一步:定义遍历函数

根据题目中的“后序非递归遍历二叉树”,我们需要:

  1. 定义一个遍历函数 Nonpost,它接受一个二叉树节点的指针作为参数。

这部分的代码为:

void Nonpost(BTNode* bt) {BTNode *St[maxsize], *tag = NULL;int top = -1;

第二步:遍历二叉树

根据题目中的“后序非递归遍历”,我们需要:

  1. 使用一个栈 St 来存储节点,top 用于指示栈顶。
  2. 使用一个 while 循环来遍历树,直到栈为空且当前节点为 NULL
  3. 如果当前节点不为空,将其压入栈并移动到其左子节点。
  4. 如果当前节点为空,从栈中弹出一个节点,并检查其右子节点。
  5. 如果右子节点存在且未被访问过,移动到右子节点。
  6. 否则,访问弹出的节点,并将其标记为已访问,然后将当前节点设置为 NULL

这部分的代码为:

    while (bt || top != -1) {if (bt != NULL) {St[++top] = bt; // 将当前节点压入栈bt = bt->lchild; // 移动到左子节点} else {bt = St[top]; // 从栈中弹出节点if (bt->rchild && bt->rchild != tag) {bt = bt->rchild; // 移动到右子节点} else {bt = St[top--]; // 弹出节点cout << bt->data << " "; // 访问节点tag = bt; // 标记节点为已访问bt = NULL; // 将当前节点设置为NULL}}}
}

完整代码

#include <iostream>
using namespace std;// 定义二叉树节点结构
struct BTNode {int data;BTNode *lchild, *rchild;
};// 后序非递归遍历二叉树
void Nonpost(BTNode* bt) {BTNode *St[maxsize], *tag = NULL;int top = -1;while (bt || top != -1) {if (bt != NULL) {St[++top] = bt; // 将当前节点压入栈bt = bt->lchild; // 移动到左子节点} else {bt = St[top]; // 从栈中弹出节点if (bt->rchild && bt->rchild != tag) {bt = bt->rchild; // 移动到右子节点} else {bt = St[top--]; // 弹出节点cout << bt->data << " "; // 访问节点tag = bt; // 标记节点为已访问bt = NULL; // 将当前节点设置为NULL}}}
}

代码过程表格

描述变量在每一步的变化:

步骤bttopSttag输出
初始根节点-1NULL
1左子节点0根节点NULL
2左子节点的左子节点1根节点, 左子节点NULL
3NULL1根节点, 左子节点NULL
4右子节点1根节点, 左子节点左子节点
5右子节点的右子节点2根节点, 左子节点, 右子节点左子节点
6NULL2根节点, 左子节点, 右子节点左子节点右子节点的数据
7左子节点2根节点, 左子节点, 右子节点右子节点

注意:
这个表格假设二叉树至少有两个节点,并且树的结构是已知的。在实际应用中,树的结构会根据具体情况而有所不同。


http://www.mrgr.cn/news/69892.html

相关文章:

  • 深入探讨 MySQL 配置与优化:从零到生产环境的最佳实践20241112
  • Flutter开发应用安装二次打开闪退,ios解决方案
  • 自适应数据结构、自适应哈希表 (Adaptive Hash Table)详细介绍
  • 1.3 10S命令行模式
  • adb 命令查看设备存储占用情况
  • GPU性能测试,环境搭建笔记,transformers/huggingface_hub改国内源,BertLayer import 报错
  • 全面掌握微信小程序开发:从入门到精通
  • Spring MVC(一)
  • Hbase集群搭建
  • conda和conda的常用命令
  • 回看《赢在下班后读后感》
  • 轻松获取 TikTok 视频素材!去水印下载不再难---如何下载Tik Tok视频【2024版攻略】
  • GAT详解带例子
  • 基于卷积神经网络的车辆损坏部位检测系统带gui
  • 32.婚恋网站系统(基于SSM的Java项目)
  • 存算分离与计算向数据移动:深度解析与Java实现
  • RT-DETR实战TT100K中国交通标志识别
  • vue之子组件向父组件传值
  • 书生大模型第四期闯关任务与笔记
  • STL学习-智能指针-shared_ptr和weak_ptr
  • 测试Rust代码
  • 程序运行的一些基础知识
  • 16、liunx硬盘修复
  • 材质(三)——材质参数集和材质函数
  • [C++11] 类中新特性的添加
  • 第三十一篇——微分(下):搞懂“奇点”,理解“连续性”