二叉树递归遍历的多语言实现

简介: 一、理论知识 1、什么是二叉树遍历     二叉树的遍历:是指按一定的规律(顺着某一条搜索路径)访问二叉树中的所有结点,使得每个结点均被访问一次,而且仅被访问一次。

一、理论知识

1、什么是二叉树遍历

    二叉树的遍历:是指按一定的规律(顺着某一条搜索路径)访问二叉树中的所有结点,使得每个结点均被访问一次,而且仅被访问一次。

    访问的含义:可以是对结点的各种处理,如修改结点数据、输出结点数据等。

    实际上,二叉树的遍历也就是要把一个非线性结构的二叉树转化为一个线性结构。

    遍历是各种数据最基本的操作,许多其他的操作可以在遍历基础上实现。

 

2、二叉树的遍历方式

    二叉树的递归定义:二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的二叉树组成。

    可见二叉树有三部分组成:根结点D ,左子树L和右子树R。

由此,遍历二叉树的方案有6种:

    先左后右: DLR , LDR , LRD
    先右后左: DRL , RDL , RLD

约定先左后右,有三种遍历方法: DLR、LDR、LRD ,分别称为先序遍历、中序遍历、后序遍历。

 

2.1 二叉树的先序遍历算法

二叉树的先序遍历算法

若二叉树为空树,则空操作;否则,

(1)访问根结点;

(2)先序遍历左子树;

(3)先序遍历右子树。

例:先序遍历下图所示的二叉树。

image
图1

(1)访问根结点“-”

(2)先序遍历左子树:即按DLR的顺序遍历左子树

(3)先序遍历右子树:即按DLR的顺序遍历右子树

    先序遍历序列:-+a*b-cd/ef

先序遍历递归算法描述如下:

  1. void Preorder ( BinTree bt )
  2. {
  3.   if ( bt )
  4.   {
  5.     visit ( bt->data );
  6.     Preorder ( bt->lchild );
  7.     Preorder ( bt->rchild );
  8.   }
  9. }


2.2 二叉树的中序遍历算法

    若二叉树为空树,则空操作;否则,

(1)中序遍历左子树;

(2)访问根结点;

(3)中序遍历右子树。

例:中序遍历上图所示的二叉树。

(1)中序遍历左子树:即按LDR的顺序遍历左子树

(2)访问根结点“-”

(3)中序遍历右子树:即按LDR的顺序遍历右子树

中序遍历序列:a+b*c-d-e/f

中序遍历递归算法描述如下:

  1. void Inorder ( BinTree bt )
  2. {
  3.   if ( bt )
  4.   {
  5.     Inorder ( bt->lchild );
  6.     visit ( bt->data );
  7.     Inorder ( bt->rchild );
  8.   }
  9. }


2.3 二叉树的后序遍历算法

    若二叉树为空树,则空操作;否则,

(1)后序遍历左子树;

(2)后序遍历右子树;

(3)访问根结点。

例:后序遍历上图所示的二叉树。

(1)后序遍历左子树:即按LRD的顺序遍历左子树

(2)后序遍历右子树:即按LRD的顺序遍历右子树

(3)访问根结点“-”

    后序遍历序列:abcd-*+ef/-

后序遍历递归算法描述如下:

   

  1. void Postorder ( BinTree bt )
  2. {
  3.   if ( bt )
  4.   {
  5.     Postorder ( bt->lchild );
  6.     Postorder ( bt->rchild );
  7.     visit ( bt->data );
  8.   }
  9. }

 
二叉树的三种遍历算法小结


    三种遍历算法不同之处仅在于访问根结点、遍历左子树、遍历右子树的先后关系。若不考虑visit()语句,则三种遍历方法完全相同(访问路径是相同的,只是访问结点的时机不同)。

    三种遍历算法均是递归算法:

    (1)树的定义本身就是递归的;

    (2)递归和栈密切联系:递归过程实际就是对栈的操作过程;

    (3)可以直接通过对栈的操作,来把递归算法写为非递归算法。

 

二、程序设计

C语言实现二叉树的遍历
  1. // BitTreeForCPP.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"

  4. typedef struct SBitTreeNode
  5. {
  6.     int Data;
  7.     SBitTreeNode *LNode;
  8.     SBitTreeNode *RNode;
  9.     SBitTreeNode *PNode;
  10. }SBitTreeNode,*SBTNode;

  11. static void SetTree(SBTNode treeNode,int data,SBTNode lNode,SBTNode rNode,SBTNode pNode)
  12. {
  13.     treeNode->Data = data;
  14.     treeNode->LNode = lNode;
  15.     treeNode->RNode = rNode;
  16.     treeNode->PNode = pNode;
  17. }

  18. static void PreorderTraversal(SBTNode treeNode)
  19. {
  20.     if(treeNode != NULL)
  21.     {
  22.         printf("%d",treeNode->Data);
  23.         PreorderTraversal(treeNode->LNode);
  24.         PreorderTraversal(treeNode->RNode);
  25.     }
  26.     else
  27.         return;
  28. }

  29. static void InorderTraversal(SBTNode treeNode)
  30. {
  31.     if(treeNode != NULL)
  32.     {
  33.         InorderTraversal(treeNode->LNode);
  34.         printf("%d",treeNode->Data);
  35.         InorderTraversal(treeNode->RNode);
  36.     }
  37.     else
  38.         return;
  39. }

  40. static void PostorderTraversal(SBTNode treeNode)
  41. {
  42.     if(treeNode != NULL)
  43.     {
  44.         PostorderTraversal(treeNode->LNode);
  45.         PostorderTraversal(treeNode->RNode);
  46.         printf("%d",treeNode->Data);
  47.     }
  48.     else
  49.         return;
  50. }

  51. int _tmain(int argc, _TCHAR* argv[])
  52. {
  53.     SBitTreeNode node1;
  54.     SBitTreeNode node2;
  55.     SBitTreeNode node3;
  56.     SBitTreeNode node4;

  57.     SBitTreeNode node5;
  58.     SBitTreeNode node6;
  59.     SBitTreeNode node7;

  60.     SetTree(&node1,1,&node2,&node3,NULL);
  61.     SetTree(&node2,2,&node4,&node5,&node1);
  62.     SetTree(&node3,3,NULL,&node6,&node1);
  63.     SetTree(&node4,4,NULL,NULL,&node2);

  64.     SetTree(&node5,5,NULL,NULL,&node2);
  65.     SetTree(&node6,6,NULL,&node7,&node3);
  66.     SetTree(&node7,7,NULL,NULL,&node6);

  67.     printf("--------------------- PreorderTraversal ---------------------\n");
  68.     PreorderTraversal(&node1);
  69.     printf("\n--------------------- InorderTraversal ---------------------\n");
  70.     InorderTraversal(&node1);
  71.     printf("\n--------------------- PostorderTraversal ---------------------\n");
  72.     PostorderTraversal(&node1);

  73.     getchar();
  74.     return 0;
  75. }

image
图2

 

C#实现二叉树的遍历


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;


  5. namespace CBitTreeProject
  6. {
  7.     class Program
  8.     {
  9.         public class CTreeNodeT>
  10.         {
  11.             public CTreeNodeT> LNode
  12.             {
  13.                 set;
  14.                 get;
  15.             }

  16.             public CTreeNodeT> RNode
  17.             {
  18.                 set;
  19.                 get;
  20.             }

  21.             public CTreeNodeT> PNode
  22.             {
  23.                 set;
  24.                 get;
  25.             }

  26.             public T Data
  27.             {
  28.                 set;
  29.                 get;
  30.             }

  31.             public CTreeNode(T data)
  32.             {
  33.                 this.Data = data;
  34.             }
  35.         };


  36.         static void Main(string[] args)
  37.         {
  38.             CTreeNodeint> node1 = new CTreeNodeint>(1);
  39.             CTreeNodeint> node2 = new CTreeNodeint>(2);
  40.             CTreeNodeint> node3 = new CTreeNodeint>(3);
  41.             
  42.             CTreeNodeint> node4 = new CTreeNodeint>(4);
  43.             CTreeNodeint> node5 = new CTreeNodeint>(5);
  44.             CTreeNodeint> node6 = new CTreeNodeint>(6);
  45.             CTreeNodeint> node7 = new CTreeNodeint>(7);

  46.             SetTree(ref node1, node2, node3, null);
  47.             SetTree(ref node2, node4, node5, node1);
  48.             SetTree(ref node3, null, node6, node1);
  49.             SetTree(ref node6, null, node7, node6);

  50.             Console.WriteLine("--------------------------------- Preorder traversal ----------------------------------------\n");
  51.             PreorderTraversal(node1);
  52.             Console.WriteLine("--------------------------------- Inorder traversal ----------------------------------------\n");
  53.             InorderTraversal(node1);
  54.             Console.WriteLine("--------------------------------- Postorder traversal ----------------------------------------\n");
  55.             PostorderTraversal(node1);

  56.             Console.ReadLine();
  57.         }

  58.         /** *************************************************************************************************
  59.          * DESC :
  60.          * ARGC :
  61.          * RET : success, true; fail, false.
  62.          *---------------------------------------------------------------------------------------------------
  63.         ****************************************************************************************************/
  64.         public static void SetTree(ref CTreeNodeint> treeNode,CTreeNodeint> lNode,CTreeNodeint> rNode,CTreeNodeint> pNode)
  65.         {
  66.             treeNode.LNode = lNode;
  67.             treeNode.RNode = rNode;
  68.             treeNode.PNode = pNode;
  69.         }

  70.         public static void PreorderTraversal(CTreeNodeint> treeNode)
  71.         {
  72.             if (treeNode != null)
  73.             {
  74.                 Console.WriteLine(treeNode.Data);
  75.                 PreorderTraversal(treeNode.LNode);
  76.                 PreorderTraversal(treeNode.RNode);
  77.             }
  78.             else
  79.                 return;
  80.         }

  81.         public static void InorderTraversal(CTreeNodeint> treeNode)
  82.         {
  83.             if (treeNode != null)
  84.             {
  85.                 InorderTraversal(treeNode.LNode);
  86.                 Console.WriteLine(treeNode.Data);
  87.                 InorderTraversal(treeNode.RNode);
  88.             }
  89.             else
  90.                 return;
  91.         }

  92.         public static void PostorderTraversal(CTreeNodeint> treeNode)
  93.         {
  94.             if (treeNode != null)
  95.             {
  96.                 PostorderTraversal(treeNode.LNode);
  97.                 PostorderTraversal(treeNode.RNode);
  98.                 Console.WriteLine(treeNode.Data);
  99.             }
  100.             else
  101.                 return;
  102.         }
  103.     }
  104. }



image 
图3


参考博客1:
http://www.lmwlove.com/ac/ID958

参考博客2:

http://www.91computer.com/datastruct/index.asp

 


相关文章
|
8天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
7天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
346 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
19天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1331 8
|
7天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
333 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
6天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
18天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1421 87
|
6天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
7天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
260 82
2025年阿里云域名备案流程(新手图文详细流程)