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

news2024/9/25 17:20:18

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

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

 // 二叉树节点定义
 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);//进行后序遍历
}

在这里插入图片描述

步骤五 运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Base64简单介绍

1. Base64工具 工具链接 2. Base64示例代码 public class Base64Demo {// 请注意&#xff0c;在处理二进制数据时&#xff08;例如图片或文件&#xff09;&#xff0c;不需要将字节数组转换为字符串再进行编码或解码&#xff0c;// 可以直接对字节数组进行Base64操作。上述…

Python基础知识总结3-面向对象进阶知识

面向对象三大特征介绍 继承子类扩展父类语法格式关于构造函数&#xff1a;类成员的继承和重写查看类的继承层次结构 object根类dir() 查看对象属性重写 __str__() 方法 多重继承MRO方法解析顺序super()获得父类定义多态特殊方法和运算符重载特殊属性 对象的浅拷贝和深拷贝组合_…

学习笔记——C++一维数组

1&#xff0c;一维数组的定义方式 三种定义方式 1&#xff0c;数据类型 数组名[ 数组长度 ]&#xff1b; 2&#xff0c;数据类型 数组名[ 数组长度 ]{值1&#xff0c;值2&#xff0c;值3 ……}&#xff1b;//未说明的元素用0填补 3&#xff0c;数据类型 数组名[ ]{值1&…

【数据仓库与联机分析处理】数据仓库工具Hive

目录 一、Hive简介 &#xff08;一&#xff09;什么是Hive &#xff08;二&#xff09;优缺点 &#xff08;三&#xff09;Hive架构原理 &#xff08;四&#xff09;Hive 和数据库比较 二、MySQL的安装配置 三、Hive的安装配置 1、下载安装包 2、解压并改名 3、配置环…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

React 中条件渲染的 N 种方法

本文作者系360奇舞团前端开发工程师 条件渲染在React开发中非常重要的功能&#xff0c;它允许开发人员根据条件控制渲染的内容&#xff0c;在创建动态和交互式用户界面方面发挥着至关重要的作用&#xff0c;本文总结了常用的的条件渲染方法。 1.If-else if-else是一种控制流程的…

rime中州韵小狼毫 敏感词脱敏滤镜

快速录入&#xff0c;是任何一个输入法&#xff0c;以及输入人员&#xff08;无论是否专业&#xff09;的追求目标之一。现实中&#xff0c;由于各种输入法在录入文本时&#xff0c;都无法完全避免重码的问题&#xff0c;所以在输入过程中都或多或少的需要进行选字/选词操作。这…

OpenSource - 基于Netty的网络扩展库HServer

文章目录 概述官网Hserver的理念特点原理图代码案例HelloWorld 概述 HServer是一个基于Netty开发网络扩展库.使用插件方式来扩展我们的业务 HServer提供 web,gateway,rpc 等插件 同时用户也可以自定义插件&#xff0c;来完成各种各样的业务场景。 官网 https://gitee.com/HSe…

认识Git

&#x1f30e;初识Git 初识Git 什么是Git Git的安装       Centos平台安装Git       Ubuntu平台安装Git Git的基本操作       创建远程仓库       配置Git 认识工作区、暂存区与版本库       添加文件到暂存区       将暂存区文件提交至本…

JVM中对象的创建

一.JVM运行流程 JVM向操作系统申请内存&#xff0c;初始化运行时数据区&#xff0c;接下来装载使用的类&#xff0c;执行类里面相应方法的时候为当前虚拟机栈压入一个栈帧&#xff0c;方法执行完成后栈帧出栈&#xff0c;进行垃圾回收。 二.JVM中对象的创建过程 符号引用&…

三维模型数据的几何坐标变换的点云重建并行计算技术方法分析

三维模型数据的几何坐标变换的点云重建并行计算技术方法分析 倾斜摄影三维模型数据的几何坐标变换与点云重建并行计算技术的探讨主要涉及以下几个方面&#xff1a; 1、坐标系定义与转换&#xff1a;在进行坐标变换前&#xff0c;需要确定各个参考系的定义并实现坐标系之间的转…

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CNN-LSTM-KDE多变量时间序列区…

WorkPlus AI助理为企业提供智能客服的机器人解决方案

在数字化时代&#xff0c;企业面临着客户服务的重要挑战。AI客服机器人成为了提升客户体验和提高工作效率的关键工具。作为一款优秀的AI助理&#xff0c;WorkPlus AI助理以其智能化的特点和卓越的功能&#xff0c;为企业提供了全新的客服机器人解决方案。 为什么选择WorkPlus A…

Proteus 各版本安装指南

Proteus下载链接 https://pan.baidu.com/s/1vHgg8jK9KSHdxSU9SDy4vQ?pwd0531 1.鼠标右击【Proteus8.15(64bit&#xff09;】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到Proteus8.15(64bit&#xff09; 】。 2.打开解压后的文件夹&#…

Java最大优先队列设计与实现

Java 学习面试指南&#xff1a;https://javaxiaobear.cn 1、API设计 类名MaxPriorityQueue构造方法MaxPriorityQueue(int capacity)&#xff1a;创建容量为capacity的MaxPriorityQueue对象成员方法private boolean less(int i,int j)&#xff1a;判断堆中索引i处的元素是否小…

CSS基础笔记-04cascade-specificity-inheritance

CSS基础笔记系列 《CSS基础笔记-01CSS概述》《CSS基础笔记-02动画》CSS基础笔记-03选择器 前言 Cascading Style Sheets&#xff0c;关键就在于这个cascading&#xff0c;对于这个术语理解&#xff0c;感觉对于我这种CSS新手有点儿不太friendly。本文记录下我对这个术语的理…

Java大数据hadoop2.9.2搭建伪分布式yarn资源管理器

1、修改配置文件 cd /usr/local/hadoop/etc/hadoop cp ./mapred-site.xml.template ./mapred-site.xml vi mapred-site.xml <configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property> &l…

1_工程设计模式-简单工厂设计

工程设计模式 一.简单工程设计模式 1.概念 简单工厂模式( Simple Factory Pattern )是指由一个工厂对象决定创建出哪一种产品类的实例。 但它不属于 GOF 23 种设计模式。简单工厂适用于工厂类负责创建的对象较少的场景&#xff0c;且客户端只需要传入工厂类的参数&#xff…

Java SE面试

1.什么是 Java&#xff1f; Java 是一门面向对象的编程语言&#xff0c;不仅吸收了 C语言的各种优点&#xff0c;还摒弃了 C里难以理解的多继承、指针等概念&#xff0c;因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表&#xff…

微信小程序 引导地址授权 获取位置信息 uniapp

概述 获取位置信息&#xff0c;需要保证是否授权位置信息&#xff0c;有几个条件是导致无法授权的原因 &#xff08;1&#xff09;微信应用未授权定位设置 &#xff08;2&#xff09;首次进入小程序未授权位置信息 &#xff08;3&#xff09;小程序之前阻止过授权位置信息 &…