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

简介: 一、理论知识 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

 


相关文章
|
6月前
|
人工智能 Java 测试技术
二叉树通过前序中序来构建二叉树(炒鸡详细到每一步)
二叉树通过前序中序来构建二叉树(炒鸡详细到每一步)
|
3月前
|
算法
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
41 0
|
3月前
|
算法
平衡二叉树的构建(递归
平衡二叉树的构建(递归
42 0
|
8月前
|
Java
java实现树的前序遍历,递归和非递归实现(简单明了)
java实现树的前序遍历,递归和非递归实现(简单明了)
70 0
|
9月前
中序线索二叉树的实现(源代码以及讲解)
中序线索二叉树的实现(源代码以及讲解)
88 0
|
10月前
|
存储 机器学习/深度学习 Java
数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)
4.1.树 树,由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构。树需要满足以下条件: 任何结点的子节点不相交。 任何子结点只有一个父节点。 N个结点,N-1条边。 对于一个非空树(结点数≥0),具有以下性质: 起始结点称为“根” 除根结点外可分为m个互不相交的有限集合,其中每个集合本身也是一棵树,称为原来这棵树的“子树”。
108 0
|
11月前
【数据结构入门】二叉树的遍历(前序、中序、后序、层序)
【数据结构入门】二叉树的遍历(前序、中序、后序、层序)
682 0
二叉树的三种非递归遍历方式
二叉树的三种非递归遍历方式
|
前端开发
前端知识案例-二叉树的遍历(前序 中序 后序)
前端知识案例-二叉树的遍历(前序 中序 后序)
53 0
前端知识案例-二叉树的遍历(前序 中序 后序)
|
C++
由前序遍历和中序遍历构建二叉树(C++语言)
由前序遍历和中序遍历构建二叉树(C++语言)
100 0