zoukankan      html  css  js  c++  java
  • C#先序遍历2叉树(非递归)

    找了下先序遍历二叉树C# 实现貌似没有 顺手些了一个

     大致思路是:

    传入根节点,然后依次循环其子节点推入到栈中,

    当推入的节点没有子节点的时候(叶子)或者所有子节点均已经遍历过后(上一次遍历的节点是该节点的右子节点),再依次退出栈。

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6  
      7 namespace ConsoleApplication5
      8 {
      9     class Program
     10     {
     11         static void Main(string[] args)
     12         {
     13             Node treeRoot = CreateTree();
     14             scanTree(treeRoot);
     15         }
     16  
     17         private static void scanTree(Node treeRoot)
     18         {
     19             List<Node> list = new List<Node>();
     20             list.Add(treeRoot);
     21             Node point = treeRoot;
     22             Write(treeRoot);
     23             while (true)
     24             {
     25                 if (!list.Contains(point))
     26                 { //上一轮是移除的操作
     27                     if (treeRoot.leftSon == point)
     28                     {//移除的是左结点
     29                         if (treeRoot.rightSon != null)
     30                         {
     31                             treeRoot = treeRoot.rightSon;
     32                             list.Add(treeRoot);
     33                             Write(treeRoot);
     34                             point = treeRoot;
     35                             continue;
     36                         }
     37                         list.Remove(treeRoot);
     38                         if (list.Count == 0)
     39                         {
     40                             break;
     41                         }
     42                         point = treeRoot;
     43                         treeRoot = list[list.Count - 1];
     44                     }
     45                     else
     46                     {//移除的是右结点
     47                         list.Remove(treeRoot);
     48                         if (list.Count == 0)
     49                         {
     50                             break;
     51                         }
     52                         point = treeRoot;
     53                         treeRoot = list[list.Count - 1];
     54                     }
     55                     continue;
     56                 }
     57  
     58                 if (treeRoot.leftSon != null)
     59                 {
     60                     treeRoot = treeRoot.leftSon;
     61                     Write(treeRoot);
     62                     list.Add(treeRoot);
     63                     point = treeRoot;
     64                     continue;
     65                 }
     66                 if (treeRoot.rightSon != null)
     67                 {
     68                     treeRoot = treeRoot.rightSon;
     69                     Write(treeRoot);
     70                     point = treeRoot;
     71                     list.Add(treeRoot);
     72                     continue;
     73                 }
     74                 //当前的节点是叶子节点   if (treeRoot.leftSon == null && treeRoot.rightSon == null)
     75                 //{
     76                     list.Remove(treeRoot);
     77                     if (list.Count == 0)
     78                     {
     79                         break;
     80                     }
     81                     point = treeRoot;
     82                     treeRoot = list[list.Count - 1];
     83                // }
     84             }
     85  
     86         }
     87  
     88         public static void Write(Node node)
     89         {
     90             Console.WriteLine(node.Data);
     91         }
     92  
     93         private static Node CreateTree()
     94         {
     95             Node a = new Node("A");
     96            a.leftSon = new Node("B");
     97             a.rightSon = new Node("C");
     98            
     99            a.leftSon.leftSon = new Node("D");
    100            a.leftSon.rightSon = new Node("E");
    101            
    102            a.rightSon.leftSon = new Node("F");
    103            a.rightSon.rightSon = new Node("G");
    104  
    105            a.leftSon.leftSon.leftSon = new Node("H");
    106            a.leftSon.leftSon.rightSon = new Node("I");
    107             return a;
    108         }
    109     }
    110  
    111     class Node
    112     {
    113         public string Data { get; set; }
    114         public Node leftSon { get; set; }
    115         public Node rightSon { get; set; }
    116  
    117         public Node(string data)
    118         {
    119             Data = data;
    120         }
    121     }
    122 }
  • 相关阅读:
    湘潭大学 Hurry Up 三分,求凹函数的最小值问题
    hdu 1166 线段树 单点修改 + 询问区间求和 (线段树模板)
    hdu 1166 树状数组(模板) 更改点值+求区间和
    getline
    poj 1873 The Fortified Forest 凸包+位运算枚举 world final 水题
    C# 代码操作XML(增、删、改)
    C# Socket服务端与客户端通信(包含大文件的断点传输)
    MD5 十六进制加密
    C# 面向对象——多态
    C# 面向对象——继承
  • 原文地址:https://www.cnblogs.com/jilodream/p/4268708.html
Copyright © 2011-2022 走看看