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日

相关文章

  • vmware打开虚拟机没反应的解决方案(全面汇总)

    以下是“VMware打开虚拟机没反应的解决方案(全面汇总)”的标准markdown格式文本,其中包含了两个示例说明: VMware打开虚拟机没反应的解决方案(全面汇总) 在使用VMware虚拟机时,有时会出现打开虚拟机没反应的情况。本文将介绍如解决VMware打开虚拟机没反应的问题,包括如何检查虚拟机配置、如何检查VMware服务等。 1. 检查虚拟机配置 …

    other 2023年5月10日
    00
  • 详解关于html,css,js三者的加载顺序问题

    当网页被访问时,浏览器加载HTML、CSS和JavaScript的顺序非常重要。正确的加载顺序可以确保网站在用户端正确渲染,错序的加载则可能导致页面无法正常显示或者工作不正常。 以下是一个关于HTML、CSS、JS加载顺序问题的详细攻略。 HTML、CSS、JS的加载顺序 当用户访问一个网站时,浏览器按照以下顺序加载页面上的HTML、CSS和JavaScri…

    other 2023年6月25日
    00
  • ORACLE EXP不能导出空表的原因分析及解决方法

    Oracle EXP不能导出空表的原因分析及解决方法 问题描述 在使用Oracle EXP工具导出数据库时,发现无法导出空表,命令如下: exp user/pass@instance tablespaces=users file=users.dmp log=users.log 执行该命令时,提示以下错误: EXP-00008: ORACLE error 90…

    other 2023年6月27日
    00
  • ubuntu定时任务

    当然,我很乐意为您提供有关“Ubuntu定时任务”的完整攻略。以下是详细的步骤和两个示例: 1. Ubuntu定时任务 在Ubuntu中,可以使用cron来设置定时任务。cron是一个在后台运行的守护进程,用于在指定的时间执行预定的命令或脚本。 2. Ubuntu定时任务的设置 以下是Ubuntu定时任务的设置步骤: 2.1 编辑cron表 使用以下命令编辑…

    other 2023年5月6日
    00
  • 什么是ssrssr有什么用如何使用使用ssr

    什么是 SSR, SSR 有什么用,如何使用 SSR? 什么是 SSR? SSR (ShadowsocksR) 是一种基于 Socks5 代理技术的网络加速工具。它通过对网络流量进行加密和伪装,可以有效地隐藏数据传输过程中的敏感信息,提高安全性和隐私保护。同时,SSR 还能够绕过国家级别的网络封锁和限制,帮助用户快速高效地访问被屏蔽的网站和服务。 SSR 有…

    其他 2023年3月29日
    00
  • FastDFS分布式文件系统环境搭建及安装过程解析

    提交FastDFS的作用 FastDFS是高性能、轻量级的分布式文件系统。它通过将文件存储在多个存储服务器中来实现快速访问和高可用性。FastDFS采用了分布式存储架构,将文件划分为多个块(Block),然后将每个块分别存储在不同的服务器上。 FastDFS的优点: 可靠性高:FastDFS的分布式存储架构,使它能够自动管理数据备份和恢复,保证数据的可靠性,…

    other 2023年6月27日
    00
  • winscp简介及命令 远程工具介绍

    WinSCP简介及命令 远程工具介绍 WinSCP是什么? WinSCP(Windows Secure Copy)是一款免费的SFTP、SCP和FTP客户端软件。使用WinSCP,您可以在本地计算机和远程计算机之间传输文件。WinSCP提供基本的文件管理功能,如删除、复制和重命名文件等。 WinSCP的特点 免费软件,基于GPL协议 支持SFTP、SCP、F…

    other 2023年6月26日
    00
  • windows下es安装教程

    Windows下ES安装教程 Elasticsearch是一个高度可扩展的开源搜索与分析引擎,被广泛应用于日志分析、全文检索等应用场景中。本文将带领读者了解如何在Windows系统下安装和配置Elasticsearch。 前置条件 在进行ES安装前,需要确保以下环境已经准备完成: Java JDK 8 (推荐使用OpenJDK) 若您的电脑没有安装以上环境,…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部