zoukankan      html  css  js  c++  java
  • 重学算法(1)--遍历二叉树

      1 public class Tree<T> where T : IComparable<T>
      2     {
      3         /// <summary>
      4         /// 定义树
      5         /// </summary>
      6         private T data;
      7         private Tree<T> left;
      8         private Tree<T> right;
      9 
     10         /// <summary>
     11         /// 构造函数
     12         /// </summary>
     13         /// <param name="nodeValue">二叉树根节点</param>
     14         public Tree(T nodeValue)
     15         {
     16             this.data = nodeValue;
     17             this.left = null;
     18             this.right = null;
     19         }
     20 
     21         /// <summary>
     22         /// 数据节点属性
     23         /// </summary>
     24         public T NodeData
     25         {
     26             get { return this.data; }
     27             set { this.data = value; }
     28         }
     29 
     30         public Tree<T> leftTree
     31         {
     32             get { return this.left; }
     33             set { this.left = value; }
     34         }
     35 
     36         public Tree<T> rightTree
     37         {
     38             get { return this.right; }
     39             set { this.right = value; }
     40         }
     41 
     42         /// <summary>
     43         /// 插入节点 小于该节点的放左侧,大于该节点的放右侧
     44         /// </summary>
     45         /// <param name="newItem"></param>
     46         public void Insert(T newItem)
     47         {
     48             T currentNodeValue = this.NodeData;
     49             if (currentNodeValue.CompareTo(newItem) > 0)
     50             {
     51                 if (this.leftTree == null)
     52                 {
     53                     this.leftTree = new Tree<T>(newItem);
     54                 }
     55                 else
     56                 {
     57                     this.leftTree.Insert(newItem);
     58                 }
     59             }
     60             else
     61             {
     62                 if (this.rightTree == null)
     63                 {
     64                     this.rightTree = new Tree<T>(newItem);
     65                 }
     66                 else
     67                 {
     68                     this.rightTree.Insert(newItem);
     69                 }
     70             }
     71         }
     72 
     73         /// <summary>
     74         /// 先序遍历 根 左 右
     75         /// </summary>
     76         /// <param name="root"></param>
     77         public void PreOrderTree(Tree<T> root)
     78         {
     79             if (root != null)
     80             {
     81                 Console.Write(root.NodeData);
     82                 PreOrderTree(root.leftTree);
     83                 PreOrderTree(root.rightTree);
     84             }
     85         }
     86 
     87         /// <summary>
     88         /// 中序遍历 左 根 右
     89         /// </summary>
     90         /// <param name="root"></param>
     91         public void InOrderTree(Tree<T> root)
     92         {
     93             if (root != null)
     94             {
     95                 InOrderTree(root.leftTree);
     96                 Console.Write(root.NodeData);
     97                 InOrderTree(root.rightTree);
     98             }
     99         }
    100 
    101         /// <summary>
    102         /// 后序遍历 左 右 根
    103         /// </summary>
    104         /// <param name="root"></param>
    105         public void PostOrderTree(Tree<T> root)
    106         {
    107             if (root != null)
    108             {
    109                 PostOrderTree(root.leftTree);
    110                 PostOrderTree(root.rightTree);
    111                 Console.Write(root.NodeData);
    112             }
    113         }
    114 
    115         /// <summary>
    116         /// 逐层遍历:从根节点开始,访问一个节点然后将左右子树的根节点依次放入链表中,删除该节点
    117         /// 遍历到链表中没有数据为止
    118         /// </summary>
    119         public void WideOrderTree()
    120         {
    121             List<Tree<T>> nodeList = new List<Tree<T>>();
    122             nodeList.Add(this);
    123             Tree<T> temp = null;
    124             while (nodeList.Count > 0)
    125             {
    126                 Console.Write(nodeList[0].NodeData);
    127                 temp = nodeList[0];
    128                 nodeList.Remove(nodeList[0]);
    129                 if (temp.leftTree != null)
    130                 {
    131                     nodeList.Add(temp.leftTree);
    132                 }
    133                 if (temp.rightTree != null)
    134                 {
    135                     nodeList.Add(temp.rightTree);
    136                 }
    137             }
    138             Console.WriteLine();
    139         }
    140 
    141     }
    View Code

    这是第二次让人讲二叉树了,一定不可以忘记!

  • 相关阅读:
    25.C++- 泛型编程之函数模板(详解)
    Windows10 + Visual Studio 2017 + CMake +OpenCV编译、开发环境配置及测试
    终于解决了python 3.x import cv2 “ImportError: DLL load failed: 找不到指定的模块” 及“pycharm关于cv2没有代码提示”的问题
    Python的开源人脸识别库:离线识别率高达99.38%(附源码)
    python获取公网ip的几种方式
    Chrome与chromedriver.exe的版本对应
    Google Gson用法
    idea 报错javax/xml/bind/DatatypeConverter
    org.slf4j:slf4j-api:添加日志管理
    基本使用——OkHttp3详细使用教程
  • 原文地址:https://www.cnblogs.com/shuaichao/p/4268162.html
Copyright © 2011-2022 走看看