C#使用栈方法遍历二叉树

步骤一:定义一个二叉树的节点类

定义一个二叉树的节点类,其中包含节点的值、左子节点和右子节点。

 // 二叉树节点定义
 public class TreeNode
 {
     public int Value { get; set; }  // 节点的值
     public TreeNode Left { get; set; }  // 左子节点
     public TreeNode Right { get; set; }  // 右子节点

     public TreeNode(int value)
     {
         Value = value;
     }
 }

步骤二:定义一个二叉树类

我们定义一个二叉树类,其中包含了三种遍历方式的方法。

 public class BinaryTree
 {
     // 前序遍历
     public void PreorderTraversal(TreeNode root)
     {
          //相关代码
     }

     // 中序遍历
     public void InorderTraversal(TreeNode root)
     {
       //相关代码
     }

     // 后序遍历
     public void PostorderTraversal(TreeNode root)
     {
        //相关代码
     }
 }

步骤三 三种遍历方法

前序遍历

前序遍历:从根节点开始,先输出节点值,再依次将右子节点和左子节点压入栈中。

 // 前序遍历
 public void PreorderTraversal(TreeNode root)
 {
     if (root == null)
         return;

     Stack<TreeNode> stack = new Stack<TreeNode>();  // 定义一个栈
     stack.Push(root);  // 将根节点压入栈中
     Console.Write("前序遍历");
     while (stack.Count > 0)  // 当栈不为空时
     {
         TreeNode node = stack.Pop();  // 弹出栈顶节点
         Console.Write(node.Value + " ");  // 输出节点值

         if (node.Right != null)  // 若有右子节点,则将其压入栈中
             stack.Push(node.Right);

         if (node.Left != null)  // 若有左子节点,则将其压入栈中
             stack.Push(node.Left);
     }
 }

中序遍历

中序遍历:从根节点开始,先将当前节点及其左子节点全部压入栈中,然后弹出栈顶节点并输出节点值,最后处理右子节点。

 // 中序遍历
 public void InorderTraversal(TreeNode root)
 {
     if (root == null)
         return;

     Stack<TreeNode> stack = new Stack<TreeNode>();  // 定义一个栈
     TreeNode current = root;
     Console.Write("中序遍历");
     while (current != null || stack.Count > 0)  // 当节点不为空或栈不为空时
     {
         while (current != null)  // 将当前节点及其左子节点全部压入栈中
         {
             stack.Push(current);
             current = current.Left;
         }

         current = stack.Pop();  // 弹出栈顶节点
         Console.Write(current.Value + " ");  // 输出节点值

         current = current.Right;  // 处理右子节点
     }
 }

后序遍历

后序遍历:从根节点开始,先将根节点和其左右子节点依次压入第一个栈中,然后将第一个栈中的节点依次弹出并压入第二个栈中,最后依次弹出第二个栈中的节点并输出节点值。

  // 后序遍历
  public void PostorderTraversal(TreeNode root)
  {
      if (root == null)
          return;

      Stack<TreeNode> stack1 = new Stack<TreeNode>();  // 定义两个栈
      Stack<TreeNode> stack2 = new Stack<TreeNode>();
      stack1.Push(root);  // 将根节点压入第一个栈中
      Console.Write("后序遍历");
      while (stack1.Count > 0)  // 当第一个栈不为空时
      {
          TreeNode node = stack1.Pop();  // 弹出栈顶节点
          stack2.Push(node);  // 将节点压入第二个栈中

          if (node.Left != null)  // 若有左子节点,则将其压入第一个栈中
              stack1.Push(node.Left);

          if (node.Right != null)  // 若有右子节点,则将其压入第一个栈中
              stack1.Push(node.Right);
      }

      while (stack2.Count > 0)  // 当第二个栈不为空时
      {
          TreeNode node = stack2.Pop();  // 弹出栈顶节点
          Console.Write(node.Value + " ");  // 输出节点值
      }
  }

前序遍历:从根节点开始,先输出节点值,再依次将右子节点和左子节点压入栈中。

步骤四 使用

在主函数中构建一个二叉树,并调用上面定义的三种遍历方法进行遍历。

static void Main(string[] args)
{
    // 构建一个二叉树
    TreeNode root = new TreeNode(1);  // 根节点
    root.Left = new TreeNode(2);  // 左子节点
    root.Right = new TreeNode(3);  // 右子节点
    root.Left.Left = new TreeNode(4);  // 左子节点的左子节点
    root.Left.Right = new TreeNode(5);  // 左子节点的右子节点

    // 创建 BinaryTree 对象
    BinaryTree binaryTree = new BinaryTree();
    binaryTree.PreorderTraversal(root); //进行前序遍历   
    binaryTree.InorderTraversal(root);//进行中序遍历
    binaryTree.PostorderTraversal(root);//进行后序遍历
}

在这里插入图片描述

步骤五 运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 微信小程序跳转至其他小程序

一、背景&#xff1a; 需要在目前的小程序中跳转到另一个小程序&#xff0c;跳转的目标小程序需要已经发布上线了 二、具体实现 使用uni.navigateToMiniProgram打开另一个小程序 官网指引&#x1f449;&#xff1a;uni.navigateToMiniProgram(OBJECT) | uni-app官网 <t…

手把手教你用jmeter做压力测试(详图)

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

基于机器视觉的车牌检测-车牌粗略定位

基于颜色特征的定位算法 基于颜色特征的定位算法。该算法不用对整幅图像进行边缘检测&#xff0c;而是直接寻找图片中颜色、形状及纹理符合车牌特征的连通区域。通过分析车牌图像&#xff0c;发现对于具有某种目标颜色的像素&#xff0c;可以直接通过对H、S、I三分量设定一个范…

CPU平台做视频智能分析,Lnton视频分析平台不仅支持流分析,同时也支持图片分析了

LntonAIServer最新v1.0.09版本支持图片分析了&#xff0c;经过几个月的研发&#xff0c;在原有的视频流分析的基础上&#xff0c;我们终于支持大家都非常期待的图片分析功能了&#xff0c;图片分析的功能加上&#xff0c;能有利于很多场景的展开&#xff0c;比如在烟火、明厨亮…

Java学习笔记(十)——异常

一、异常的概念 二、异常体系图&#xff08;重要&#xff09; 三、常见的异常 &#xff08;一&#xff09;常见的运行时异常 1、NullPointerException空指针异常 2、ArithmeticException数学运算异常 3、ArrayIndexOutOfBoundsException数组下标越界异常 4、ClassCastEx…

阿里巴巴微服务治理框架的终极PK!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

Java调用shell脚本实现数据库备份功能

本篇文章主要介绍怎样使用Java程序&#xff0c;执行服务器上的数据库备份Shell脚本进行MySQL数据库的备份功能。 学习目标 使用Java执行Shell脚本、实现MySQL数据库的备份功能。 学习内容 编写导出MysSQL数据库的Shell脚本 以下是一个使用Bash脚本进行数据库备份的示例代码…

java基础之Java8新特性-Stream(流)

简介 流&#xff08;Stream&#xff09;是 Java 8 引入的一种处理集合数据的抽象概念&#xff0c;它提供了一种更简洁、更灵活的方式来操作和处理集合数据。流可以看作是一系列元素的管道&#xff0c;可以对这些元素进行筛选、转换、排序、归约等操作&#xff0c;实现各种数据…

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 输入&#xff1a;l1 []…

FC SAN光纤交换机维护介绍

一、什么是FC SAN &#xff1f; ​存储区域网络&#xff08;Storage Area Network&#xff0c;SAN&#xff09;采用网状通道&#xff08;Fibre Channel &#xff0c;简称FC&#xff0c;区别与Fiber Channel光纤通道&#xff09;技术&#xff0c;通过FC交换机连接存储阵列和服务…

实现目标检测中的数据格式自由(labelme json、voc、coco、yolo格式的相互转换)

在进行目标检测任务中&#xff0c;存在labelme json、voc、coco、yolo等格式。labelme json是由anylabeling、labelme等软件生成的标注格式、voc是通用目标检测框&#xff08;mmdetection、paddledetection&#xff09;所支持的格式&#xff0c;coco是通用目标检测框&#xff0…

学习笔记:C++之 switch语句

Switch语句 作用&#xff1a;执行多条件分支语句 语法&#xff1a; switch&#xff08;表达式&#xff09;{ case 结果1&#xff1a;执行语句&#xff1b;break&#xff1b; case 结果2&#xff1a;执行语句&#xff1b;break&#xff1b; ... default&#xff1a;执行语句&a…

Java反射之获取构造方法,成员变量,成员方法以及反射的作用

目录 1.什么是反射2.获取Class对象的三种方式3.反射获取构造方法4.反射获取成员变量5.反射获取成员方法6.反射的作用 1.什么是反射 在Java中&#xff0c;反射是指程序在运行时动态地获取类的信息、调用方法和访问属性的能力。 通过反射&#xff0c;可以在运行时获取类的构造函数…

什么是多因素身份验证(MFA)

多重身份验证&#xff08;MFA&#xff09;是在授予用户访问特定资源的权限之前&#xff0c;使用多重身份验证来验证用户身份的过程&#xff0c;仅使用单一因素&#xff08;传统上是用户名和密码&#xff09;来保护资源&#xff0c;使它们容易受到破坏&#xff0c;添加其他身份验…

计算机原理 (2) CPU的诞生 输入 输出 PC指针

文章目录 计算机的前世今生计算机的三个根本性基础1. 计算机是执行输入、运算、输出的机器&#xff1b;2.程序是指令和数据的集合&#xff1b;3.计算机的处理方式有时与人们的思维习惯不同 二、结论三、参考资料交个朋友 计算机的前世今生 上一篇文章最终结束的时候谈到希望给…

JavaScript异常处理实战

前言 之前在对公司的前端代码脚本错误进行排查&#xff0c;试图降低 JS Error 的错误量&#xff0c;结合自己之前的经验对这方面内容进行了实践并总结&#xff0c;下面就此谈谈我对前端代码异常监控的一些见解。 本文大致围绕下面几点展开讨论&#xff1a; JS 处理异常的方式…

鸿蒙开发基础运用(ArkTS)-健康生活APP

健康生活应用&#xff0c;主要功能包括&#xff1a; 用户可以创建最多6个健康生活任务&#xff08;早起&#xff0c;喝水&#xff0c;吃苹果&#xff0c;每日微笑&#xff0c;刷牙&#xff0c;早睡&#xff09;&#xff0c;并设置任务目标、是否开启提醒、提醒时间、每周任务频…

即时战略游戏的AI策略思考

想起来第一次玩RTS游戏&#xff0c;就是框住一大群兵进攻&#xff0c;看他们把对面消灭干净……我接触的第一款游戏是《傲世三国》那会儿是小学&#xff0c;后来高中接触了魔兽地图编辑器&#xff0c;我发现自己喜欢直接看属性而省去争论和试验的步骤——我喜欢能一眼看透的感觉…

Stable Diffusion 系列教程 - 6 Dreambooth及训练

Stable-Diffusion、Imagen等文生图大模型已经具备了强大的生成能力&#xff0c;假设我们的Prompt为 [Cyberpunk Style]&#xff0c;SD或许能很快画出赛博朋克风格的一幅画。但你作为一个不知名的人&#xff0c;不能奢求SD在训练的时候把你自己想要的风格也加进去吧&#xff1f;…

李沐-《动手学深度学习-02-目标检测

一 、目标检测算法 1. R-CNN a . 算法步骤 使用启发式搜索算法来选择锚框&#xff08;选出多个锚框大小可能不一&#xff0c;需要使用Rol pooling&#xff09;使用预训练好的模型&#xff08;去掉分类层&#xff09;对每个锚框进行特征抽取&#xff08;如VGG,AlexNet…)训练…