www.pudn.com > Crawler_bemjh.rar > SortTree.cs


using System; 
using System.Windows.Forms; 
using System.IO; 
using System.Collections; 
using System.Text.RegularExpressions; 
 
namespace CrawlerLib 
{ 
	///  
	/// Summary description for SortTree. 
	///  
	public class SortTree 
	{ 
		public SortTreeNode Root; 
		public int Count; 
		public bool Modified; 
 
		public SortTree() 
		{ 
		} 
		public void Clear() 
		{ 
			Root = null; 
			Count = 0; 
			Modified = false; 
		} 
		private SortTreeNode Add(string strText, int nCount, object Tag) 
		{ 
			SortTreeNode node = Add(ref strText); 
			node.Count = nCount; 
			node.Tag = Tag; 
			return node; 
		} 
 
		public SortTreeNode Add(ref string str) 
		{ 
			SortTreeNode node; 
			if(Root == null) 
			{ 
				Root = new SortTreeNode(); 
				node = Root; 
			} 
			else	 
			{ 
				node = Root; 
				while(true) 
				{ 
					if(node.Text == str) 
					{ 
						node.Count++; 
						return node; 
					} 
					if(node.Text.CompareTo(str) > 0) 
					{	// add the node at the small branch 
						if(node.Small == null) 
						{ 
							node.Small = new SortTreeNode(); 
							node.Small.Parent = node; 
							node = node.Small; 
							break; 
						} 
						node = node.Small; 
					} 
					else 
					{	// add the node at the great branch 
						if(node.Great == null) 
						{ 
							node.Great = new SortTreeNode(); 
							node.Great.Parent = node; 
							node = node.Great; 
							break; 
						} 
						node = node.Great; 
					} 
				}	 
			} 
			node.Text = str; 
			node.ID = this.Count++; 
			node.Count++; 
			Modified = true; 
			 
			return node; 
		} 
		 
		public void Save(string fileName, System.Text.Encoding code) 
		{ 
			FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None); 
			StreamWriter writer = new StreamWriter(stream, code); 
			 
			BitArray bitArray = new BitArray(this.Count, false); 
			SortTreeNode node = this.Root; 
			int nCount = this.Count; 
			while(nCount > 0) 
			{ 
				if(node.Small != null && bitArray.Get(node.Small.ID) == false) 
					node = node.Small; 
				else	if(bitArray.Get(node.ID) == false) 
					OutNode(node, writer, bitArray, ref nCount); 
				else	if(node.Great != null && bitArray.Get(node.Great.ID) == false) 
					node = node.Great; 
				else 
				{ 
					if(bitArray.Get(node.ID) == false) 
						OutNode(node, writer, bitArray, ref nCount); 
					node = node.Parent; 
				} 
			} 
			writer.Close(); 
			stream.Close(); 
			 
			Modified = false; 
		} 
 
		public void Open(string fileName, System.Text.Encoding code, ListView list) 
		{ 
			FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
			StreamReader reader = new StreamReader(stream, code); 
 
			SortTreeNode node = null; 
			int nTagCount = 0; 
			ArrayList array = new ArrayList(); 
			string str; 
			while((str = reader.ReadLine()) != null) 
			{ 
				string[] strCols = str.Split('\t'); 
				for(int n = 0; n < strCols.Length; n++) 
				{ 
					string strCol = strCols[n]; 
					if(n == 0) 
					{ 
						if(strCol != "") 
						{ 
							node = new SortTreeNode(); 
							node.Text = strCol; 
							array.Add(node); 
							nTagCount = 0; 
						} 
					} 
					else	if(n == 1) 
					{ 
						try 
						{ 
							if(strCol != "") 
								node.Count = int.Parse(strCol); 
						} 
						catch(Exception e) 
						{ 
							MessageBox.Show(e.Message); 
						} 
					} 
					else 
					{ 
						if(nTagCount++ > 0) 
							node.Tag += "\r\n"; 
						node.Tag += strCol; 
					} 
				} 
			} 
			reader.Close(); 
			stream.Close(); 
 
			Random rand = new Random(); 
			while(array.Count > 0) 
			{ 
				int nIndex = rand.Next(array.Count); 
				node = (SortTreeNode)array[nIndex]; 
				array.RemoveAt(nIndex); 
				node = this.Add(node.Text, node.Count, node.Tag); 
				if(list != null) 
				{ 
					ListViewItem item = list.Items.Add((node.ID+1).ToString()); 
					item.SubItems.Add(node.Text); 
					item.SubItems.Add(node.Count.ToString()); 
					item.Tag = node; 
				} 
			} 
		} 
		 
		bool OutNode(SortTreeNode node, StreamWriter writer, BitArray bits, ref int nCount) 
		{ 
			if(node == null || bits.Get(node.ID) == true) 
				return false; 
			string str = node.Text + '\t' + node.Count.ToString() + '\t'; 
			if(node.Tag != null) 
				str += node.Tag.ToString().Replace("\r\n", "\r\n\t\t"); 
			writer.WriteLine(str.TrimEnd('\t')); 
			 
			bits.Set(node.ID, true); 
			nCount--; 
			 
			return true; 
		} 
	} 
	public class SortTreeNode 
	{ 
		public SortTreeNode Parent; 
		public SortTreeNode Small; 
		public SortTreeNode Great; 
		public string Text; 
		public int Count; 
		public int ID; 
 
		public object Tag; 
	} 
 
	///  
	/// Summary description for HashTree. 
	///  
	public class HashTree 
	{ 
		public HashTreeNode Root; 
		public bool Modified; 
		public int Count; 
 
		public HashTree() 
		{ 
		} 
		public void Clear() 
		{ 
			Root = null; 
			Count = 0; 
			Modified = false; 
		} 
		public bool Add(ref string str) 
		{ 
			int Code = str.GetHashCode(); 
			HashTreeNode node; 
			if(Root == null) 
			{ 
				Root = new HashTreeNode(); 
				node = Root; 
			} 
			else	 
			{ 
				node = Root; 
				while(true) 
				{ 
					if(node.Code == Code) 
						return false; 
					if(Code < node.Code) 
					{	// add the node at the small branch 
						if(node.Small == null) 
						{ 
							node.Small = new HashTreeNode(); 
							node = node.Small; 
							break; 
						} 
						node = node.Small; 
					} 
					else 
					{	// add the node at the great branch 
						if(node.Great == null) 
						{ 
							node.Great = new HashTreeNode(); 
							node = node.Great; 
							break; 
						} 
						node = node.Great; 
					} 
				}	 
			} 
			node.Code = Code; 
			this.Modified = true; 
			this.Count++;			 
			 
			return true; 
		}		 
 
		public void Open(string fileName, System.Text.Encoding code) 
		{ 
			FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
			StreamReader reader = new StreamReader(stream, code); 
 
			string str; 
			while((str = reader.ReadLine()) != null) 
			{ 
				string[] strCols = str.Split('\t'); 
				if(strCols.Length > 0) 
					this.Add(ref strCols[0]); 
			} 
			reader.Close(); 
			stream.Close(); 
		} 
	} 
 
	public class HashTreeNode 
	{ 
		public HashTreeNode Small; 
		public HashTreeNode Great; 
		public int Code; 
	} 
}