一棵C#寫的樹(1) (轉)
的確是一個很好的面向語言,我看《資料結構(第二版)》那本書應該出本用C#描述的版本。下面是我用C#寫的一棵樹。先用介面把節點做了抽象定義,這樣在實現遍歷,插入等操作的時候只對介面進行操作。在中,我儘量使用C#的特性,如介面,屬性,玫舉,這樣程式碼雖然看起來比較冗長,但是,當程式碼越來越長的時候,你就會從中看到優點,因為合理的結構讓你永遠思路清晰。這課樹我只能算寫了一個開頭,因為如果要把所有型別的樹和加在他們之上的演算法都寫出來,我看沒有1~2k 行程式是絕對不行的,不過,只要有時間,我一定會繼續寫的,同時希望大家也寫,把這個程式碼庫完善起來。
using System;
using System.Collections;
///
/// author 何瀟(sailer)( to:he_x@263">he_x@263.net )
///
namespace Tree
{
///
/// LEFT左子樹,RIGHT右子樹
///
enum Position{LEFT,RIGHT};
///
/// LINK指向孩子,THREAD指向後繼
///
enum Tag{LINK,THREAD};
///
/// 二叉樹節點的抽象定義
///
interface IBinNode
{
bool isLeaf();
Element{get;set;}
IBinNode Left{get;set;}
IBinNode Right{get;set;}
}
///
/// 遍歷,線索化等操作的介面
///
interface ITravelBinTree
{
void PreOrderTravel();
void InOrderTravel();
void RevOrderTravel();
void Print(IBinNode t);
}
interface IInsertBinTree
{
void Insert(IBinNode node,Position pos);
}
///
/// Normal actualize of bintree
///
class BinNodePtr : IBinNode
{
protected object element;
protected IBinNode lchild;
protected IBinNode rchild;
public BinNodePtr(object e,IBinNode left,IBinNode right)
{
element = e;
lchild = left;
rchild = right;
}
public BinNodePtr(object e)
{
element = e;
lchild = rchild = null;
}
public BinNodePtr()
{
element = null;
lchild = rchild =null;
}
public bool isLeaf()
{
if(lchild==null && rchild==null)
return true;
return false;
}
public object Element
{
get{return element;}
set{element = value;}
}
public IBinNode Left
{
get
{
return lchild;
}
set
{
lchild = value;
}
}
public IBinNode Right
{
get
{
return rchild;
}
set
{
rchild = value;
}
}
}
class BinNodeLine : BinNodePtr,IBinNode
{
private Tag ltag,rtag;
public BinNodeLine(object e,IBinNode left,IBinNode right) :base(e,left,right)
{ltag = rtag = Tag.LINK;}
public BinNodeLine(object e) : base(e)
{ltag = rtag = Tag.LINK;}
public Tag LTag
{
get{return ltag;}
set{ltag = value;}
}
public Tag RTag
{
get{return rtag;}
set{rtag = value;}
}
}
class TravelBinTree : ITravelBinTree,IInsertBinTree
{
const int INIT_TREE_SIZE=20;
private IBinNode tree;
private BinNodeLine head; //線索化後的頭指標
private IBinNode prenode; //指向最近訪問過的前驅節點
public TravelBinTree()
{
tree = new BinNodePtr();
}
public TravelBinTree(IBinNode INode)
{
tree = INode;
}
///
/// 先序遍歷樹,用非遞迴演算法實現
///
///
public void PreOrderTravel()
{
IBinNode temptree;
Stack stk = new Stack(INIT_TREE_SIZE);
if(tree == null)
throw(new InvalidOperationException("訪問的樹為空"));
temptree = tree;
stk.Push(tree);
while(stk.Count!=0)
{
while(temptree!=null)
{
Print(temptree);
stk.Push(temptree.Left);
temptree = temptree.Left;
}
stk.Pop(); // 空指標退棧
if(stk.Count != 0)
{
temptree=(IBinNode)stk.Pop();
stk.Push(temptree.Right);
temptree = temptree.Right;
}
}
}
public void InOrderTravel()
{
InOrderTravel(tree);
}
private void InOrderTravel(IBinNode t)
{
if(t==null) return;
InOrderTravel(t.Left);
Print(t);
InOrderTravel(t.Right);
}
public void RevOrderTravel()
{
RevOrderTravel(tree);
}
private void RevOrderTravel(IBinNode t)
{
if(t==null) return;
RevOrderTravel(t.Left);
RevOrderTravel(t.Right);
Print(t);
}
public void Print(IBinNode t)
{
Console.Write(t.Element + ",");
}
public void Insert(IBinNode node,Position pos)
{
if(node == null)
throw(new InvalidOperationException("不能將空節點插入樹"));
switch(pos)
{
case Position.LEFT : tree.Left = node;break;
case Position.RIGHT: tree.Right = node;break;
}
}
///
/// 按照先序遍歷順序遍歷樹
///
public void TreeBuilder()
{
Stack stk = new Stack(INIT_TREE_SIZE);
stk.Push(tree);
Position pos;
string para;
p= Position.LEFT;
IBinNode baby,temp;
while(true)
{
para = Console.ReadLine();
if(para == "")
{
if(pos == Position.RIGHT)
{
stk.Pop();
while(stk.Count!=0 && ((IBinNode)stk.Peek()).Right!=null)
stk.Pop();
if(stk.Count ==0) break;
}
else
pos = Position.RIGHT;
}
else
{
if(tree.GetType().Equals()==true)
baby = new BinNodePtr(para);
temp = (IBinNode)stk.Peek();
if(pos == Position.LEFT)
temp.Left = baby;
else
temp.Right = baby;
pos = Position.LEFT;
stk.Push(baby);
}
}
}
///
/// 中序線索化
///
public void InOrderThreading()
{
head = new BinNodeLine("");
head.RTag = Tag.THREAD;
head.Right = head;
if(tree == null) head.Left = head;
else
{
head.Left = tree; prenode = head;
}
}
///
/// 中序線索化的遞迴實現
///
///
private void InThreading(IBinNode t)
{
if(t==null)
return;
else
{
InThreading(t.Left);
// if(left
}
}
}
///
/// Summary description for Class1.
///
class Class1
{
///
/// 測試控制檯
///
///
static void Main(string[] args)
{
string para = null;
para = Console.ReadLine();
BinNodePtr = new BinNodePtr(para);
TravelBinTree t = new TravelBinTree(root);
t.TreeBuilder();
t.PreOrderTravel();
Console.WriteLine("");
t.InOrderTravel();
Console.WriteLine("");
t.RevOrderTravel();
}
}
}
非常希望和大家交流( )
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992459/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- P9437 『XYGOI round1』一棵樹Go
- 【譯】繪製一棵漂亮的樹
- php 遞迴一棵樹PHP遞迴
- 如何列印一棵樹(Java)Java
- 以一棵樹的角度分析動作遊戲遊戲
- CSS控制border畫一棵小樹CSS
- 建立一棵二叉排序樹排序
- 用 vue + d3 畫一棵樹Vue
- 如何直觀形象地樹狀列印一棵二叉樹?二叉樹
- Python——畫一棵漂亮的櫻花樹(不同種櫻花+玫瑰+聖誕樹喔)Python
- 根據資料庫中取記錄自定義一棵樹結構 (轉)資料庫
- 使用clay.js繪製一棵圓形樹JS
- 全棧工程師就是一棵歪脖子樹全棧工程師
- 如何在資料庫中儲存一棵樹資料庫
- 一行 Python 程式碼搞定一棵樹Python
- 怎樣推斷一棵二叉樹是全然二叉樹二叉樹
- 如何優雅的使用javascript遞迴畫一棵結構樹JavaScript遞迴
- 【LeetCode】Symmetric Tree 推斷一棵樹是否是映象的LeetCode
- 純HTML5+CSS3實現一棵自己跳舞的樹HTMLCSSS3
- InnoDB一棵B+樹可以存放多少行資料?
- 塗雅:全棧工程師就是一棵歪脖子樹全棧工程師
- C#樹的實現C#
- 淺談C# vs Java (1) (轉)C#Java
- 在C#中使用C/C++寫的DLL (轉)C#C++
- C#中的表示式樹C#
- 面試題:InnoDB中一棵B+樹能存多少行資料?面試題
- The Overview of ECMA C# Language Specialisation (1) (轉)ViewC#
- C#使用自己寫的海龜繪圖類繪製遞迴分型樹C#繪圖遞迴
- 樹(1)--樹和二叉樹的基本定義二叉樹
- 自己動手用c#寫控制元件(上) (轉)C#控制元件
- 自己動手用c#寫控制元件(下) (轉)C#控制元件
- c# 表示式樹(一)C#
- 使用C#實現阿拉伯數字到大寫中文的轉換 (轉)C#
- 【c#表示式樹】最完善的表示式樹Expression.Dynamic的玩法C#Express
- 【資料結構虛擬碼】設計判斷一棵二叉樹是否是二叉排序樹的演算法資料結構二叉樹排序演算法
- 公司專案管理辦法的寫作格式(1)(轉)專案管理
- [轉] 如何實現 React 寫小程式-1React
- 用Delphi編寫安裝程式(1) (轉)