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

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

时间: 2024-08-13 18:10:01

重学算法(1)--遍历二叉树的相关文章

重学算法-目录

为了学习游戏,决定重学算法,下面是借用的算法目录,来告诉自己要学习的内容,务必完成. 算法 3 树 4 遍历二叉树 5 线索二叉树 6 霍夫曼树 7 图 8 深度优先搜索 9 广度优先搜索 10 最小生成树 11 最短路径 12 拓扑排序 13 关键路径 14 查找 15 线性表的查找 16 折半查找 17 树的查找 18 二叉排序树 19 平衡二叉树 20 B-树 21 B+树 22 散列表的查找 23 构造方法 24 处理冲突的方法 25 查找 26 排序 27 插入排序 28 直接插入排序

重拾算法(2)——线索二叉树

重拾算法(2)——线索二叉树 上一篇我们实现了二叉树的递归和非递归遍历,并为其复用精心设计了遍历方法Traverse(TraverseOrder order, NodeWorker<T> worker);今天就在此基础上实现线索二叉树. 什么是线索二叉树 二叉树中容易找到结点的左右孩子信息,但该结点在某一序列中的直接前驱和直接后继只能在某种遍历过程中动态获得. 先依遍历规则把每个结点某一序列中对应的前驱和后继线索预存起来,这叫做"线索化". 意义:从任一结点出发都能快速找到

研磨数据结构与算法-12遍历二叉树

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

一步两步学算法之操作二叉树

操作二叉树代码比较长    二叉树基本功能在了  注释打的比较少 1 #include "stdio.h" 2 #include "stdlib.h" 3 #define QUEUE_MAXSIZE 50 4 5 typedef char DATA; 6 typedef struct ChainTree 7 { 8 DATA data; 9 struct ChainTree *left; 10 struct ChainTree *right; 11 }ChainBi

层序遍历二叉树

周末要给老师写个期中考试的题解 最后两道题全都是关于二叉树的一些算法 层序遍历二叉树直接输入数据,建立二叉排序树,利用队列层序输出即可,没什么难度 贴下自己的代码 //功能:层序遍历二叉树 //时间:2014-11-23 #include <iostream> #include <queue> using namespace std; //二叉链表数据结构定义 #define TElemType int typedef struct BiTNode{ TElemType data;

重拾算法(1)——优雅地非递归遍历二叉树及其它

重拾算法(1)——优雅地非递归遍历二叉树及其它 本文中非递归遍历二叉树的思想和代码都来自这里(http://jianshu.io/p/49c8cfd07410#).我认为其思想和代码都足够优雅动人了,于是稍作整理,得到如下的程序. 前中后序遍历二叉树 1 public class BinaryTreeNode<T> 2 { 3 public T Value { get;set; } 4 public BinaryTreeNode<T> Parent { get;set; } 5 p

数据结构与算法(c++)——查找二叉树与中序遍历

查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) #include <queue> class BinarySearchTree { private: struct Node { int value; Node* left; Node* right; }; Node* root; void insert(Node*, int); void trav

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利