重学算法(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

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

原文地址:https://www.cnblogs.com/shuaichao/p/4268162.html