C#非递归先序遍历二叉树实例

C#非递归先序遍历二叉树实例

本文将介绍如何用C#实现非递归的先序遍历二叉树,并给出两个具体的实例说明。

前置知识

在阅读本文前,需要先了解二叉树的相关定义和先序遍历的实现方式,以及C#的基本语法。

非递归先序遍历

对于一颗二叉树,其先序遍历的过程就是先遍历根节点,然后递归地遍历左子树和右子树。而非递归的先序遍历,可以通过使用栈来实现。

具体实现过程如下:
1. 创建一个栈,将根节点入栈。
2. 循环进行以下操作:
1. 从栈顶弹出一个节点,并访问该节点。
2. 将该节点的右子节点(如果有)入栈。
3. 将该节点的左子节点(如果有)入栈。
4. 当栈为空时,终止循环。

示例说明

示例 1

假如现在有一颗二叉树,其结构如下:

        1
       / \
      2   3
     /   / \
    4   5   6
           / \
          7   8

通过非递归先序遍历,输出该二叉树的节点值,输出结果应该为:1 2 4 3 5 6 7 8。

下面是实现该功能的C#代码:

using System;
using System.Collections.Generic;

class Node {
    public int value;
    public Node left;
    public Node right;
    public Node(int val) {
        this.value = val;
    }
}

class Program {
    static void Main(string[] args) {
        Node root = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);
        Node node7 = new Node(7);
        Node node8 = new Node(8);

        root.left = node2;
        root.right = node3;
        node2.left = node4;
        node3.left = node5;
        node3.right = node6;
        node6.left = node7;
        node6.right = node8;

        PreOrderTraversal(root);
    }

    static void PreOrderTraversal(Node root) {
        Stack<Node> stack = new Stack<Node>();
        stack.Push(root);

        while (stack.Count != 0) {
            Node node = stack.Pop();
            Console.Write(node.value + " ");

            if (node.right != null) {
                stack.Push(node.right);
            }
            if (node.left != null) {
                stack.Push(node.left);
            }
        }
    }
}

示例 2

现在我们来考虑一个稍微复杂一些的例子。假设有一个二叉搜索树,其结构如下:

        4
       / \
      2   6
     / \ / \
    1  3 5  7

在该二叉树中查找指定的值3,并输出其所在的节点。

下面是实现该功能的C#代码:

using System;
using System.Collections.Generic;

class Node {
    public int value;
    public Node left;
    public Node right;
    public Node(int val) {
        this.value = val;
    }
}

class Program {
    static void Main(string[] args) {
        Node root = new Node(4);
        Node node2 = new Node(2);
        Node node3 = new Node(6);
        Node node1 = new Node(1);
        Node node4 = new Node(3);
        Node node5 = new Node(5);
        Node node6 = new Node(7);

        root.left = node2;
        root.right = node3;
        node2.left = node1;
        node2.right = node4;
        node3.left = node5;
        node3.right = node6;

        int searchValue = 3;
        Node node = Search(root, searchValue);
        if (node != null) {
            Console.WriteLine($"The node with value {searchValue} is found.");
        }
        else {
            Console.WriteLine($"The node with value {searchValue} is not found.");
        }
    }

    static Node Search(Node root, int value) {
        Stack<Node> stack = new Stack<Node>();
        stack.Push(root);

        while (stack.Count != 0) {
            Node node = stack.Pop();

            if (node.value == value) {
                return node;
            }

            if (node.right != null && node.value < value) {
                stack.Push(node.right);
            }
            if (node.left != null && node.value > value) {
                stack.Push(node.left);
            }
        }

        return null;
    }
}

以上两个示例展示了非递归先序遍历的应用场景,同时也说明了该方法的高效性和灵活性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#非递归先序遍历二叉树实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vue中动态添加class类名的方法

    当我们需要根据不同的状态或条件为某个元素动态添加class类名时,Vue提供了多种实现方式。以下是其中的两种常见方法: 1.使用动态Class绑定 1.1 基本语法 Vue提供了动态Class绑定的语法,可以很方便地实现为元素动态添加class类名。 语法::class=”{class1:class1Condition, class2:class2Condi…

    other 2023年6月27日
    00
  • ora-00942:表或视图不存在’的原因和解决方法[转]

    ‘ORA-00942:表或视图不存在’的原因和解决方法 在使用Oracle数据库时,我们经常会遇到这样的提示信息:“ORA-00942:表或视图不存在”。那么,这个错误信息出现的原因是什么?应该如何解决呢?下面,本文将为大家详细介绍。 错误信息原因解析 产生ORA-00942错误的原因,是因为SQL语句中引用了一个不存在的表名或视图名。也就是说,要么表或视图…

    其他 2023年3月28日
    00
  • java实现链表反转

    关于java实现链表反转的攻略,可以按照以下步骤进行: 1. 设计 数据结构 首先,我们需要思考数据结构的设计。对于链表,每个节点需要两个属性:节点值和指向下一节点的指针。因此,我们可以设计一个Node类,它包含两个属性,一个是节点的值,另一个是它指向下一个节点的指针。具体代码如下: //定义节点 class Node { int val; Node nex…

    other 2023年6月27日
    00
  • vue的路由守卫和keep-alive后生命周期详解

    针对“vue的路由守卫和keep-alive后生命周期详解”的攻略,本文将从以下几个方面逐一展开: 路由守卫 Vue.js提供了路由守卫,用于在路由切换前后进行回调处理,可以根据需求在路由切换前进行权限验证、登录态验证、路由拦截等操作,提高了应用的安全性和灵活性。路由守卫主要分为全局守卫和组件内守卫两种类型。 全局守卫 全局守卫是在整个应用程序中进行的。Vu…

    other 2023年6月27日
    00
  • 我的世界自定义烧制数据包制作教程

    我的世界自定义烧制数据包制作教程 本教程将详细介绍如何制作自定义烧制数据包(Custom Smelting Data Pack)来修改《我的世界》中的烧制物品的行为。以下是两个示例说明: 示例1:修改烧制物品的燃烧时间 创建一个新的数据包文件夹,命名为custom_smelting_pack。 在该文件夹中创建一个pack.mcmeta文件,并添加以下内容:…

    other 2023年10月13日
    00
  • 9个顶级开发iot项目的开源物联网平台

    9个顶级开发IoT项目的开源物联网平台 在现代工业和农业中,物联网(IoT)技术已经被广泛使用。为了实现更智能、可靠和高效的物联网解决方案,需要一个强大的物联网平台。在本文中,我们将介绍9个顶级的开源物联网平台,这些平台可以帮助开发人员快速搭建物联网系统,从而实现更好的智能化管理和控制。 1. Eclipse IoTS Wapama Eclipse IoTS…

    其他 2023年3月29日
    00
  • SQL Server中的三种物理连接操作

    SQL Server中的三种物理连接操作 在 SQL Server 中,物理连接是指数据库与应用程序之间的连接方式。物理连接主要包括三种方式:OLE DB 连接,ODBC 连接,ADO.NET 连接。下面我们将依次介绍它们的特点和应用场景。 OLE DB 连接 OLE DB (Object Linking and Embedding, Database)提供…

    其他 2023年3月28日
    00
  • tg-net新一代万兆到桌面解决方案

    TG-NET新一代万兆到桌面解决方案攻略 TG-NET新一代万兆到桌面解决方案是一种高速网络传输方案,可以将万兆网络传输速度带到桌面级别。在本攻略中,我们将详细介绍如何实现TG-NET新一代万兆到桌面解决方案,包括硬件和软件的配置。 硬件配置 在实现TG-NET新一代万兆到桌面解决方案时,我们需要准备以下硬件: 一台支持万兆网卡的计算机 一根万兆网线 一台支…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部