二叉树,查找,(breadth-first algrithm) ---前序遍历,中序遍历,后序遍历,(depth-first algrithm)-层次遍历。
摘要:
树是一种非常重要的数据结构,Binary Tree则是树型结构中应用最为广泛。本文给出了C#版本的二叉树的建立,查找,以及各种递归和非递归的遍历算法。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace DS
{
public class Tree
{
public Tree(int data)
{
_data = data;
leftChild = null;
rightChild = null;
}
private int _data;
private Tree leftChild;
private Tree rightChild;
public void PreOrder()
{
if(this != null)
{
Console.Write("{0} ", _data);
if(leftChild!=null)
leftChild.PreOrder();
if(rightChild!=null)
rightChild.PreOrder();
}
}
public void InOrder()
{
if (this != null)
{
if (leftChild != null)
leftChild.InOrder();
Console.Write("{0} ", _data);
if (rightChild != null)
rightChild.InOrder();
}
}
public void PostOrder()
{
if (this != null)
{
if (leftChild != null)
leftChild.PostOrder();
if (rightChild != null)
rightChild.PostOrder();
Console.Write("{0} ", _data);
}
}
public void PostOrderWithoutIretation()
{
Stack<Tree> stack = new Stack<Tree>();
Tree pre=null, temp;
temp=this;
while (temp != null || stack.Count != 0)
{
while (temp != null)
{
stack.Push(temp);
temp = temp.leftChild;
}
temp = stack.First<Tree>();
if (temp.rightChild == null || temp.rightChild==pre)
{
temp=stack.Pop();
Console.Write("{0} ", temp._data);
pre = temp;
temp = null;
}
else
{
temp = temp.rightChild;
}
}
}
public void InOrderWithoutIretation()
{
Stack<Tree> stack = new Stack<Tree>();
Tree temp;
temp = this;
while (temp!=null || stack.Count != 0)
{
while (temp != null)
{
stack.Push(temp);
temp = temp.leftChild;
}
temp = stack.Pop();
Console.Write(" {0} ", temp._data);
temp = temp.rightChild;
}
}
public void LevelOrder()
{
Queue<Tree> queue = new Queue<Tree>();
queue.Enqueue(this);
Tree temp;
while (queue.Count != 0)
{
temp=queue.Dequeue();
Console.Write("{0} ", temp._data);
if(temp.leftChild!=null)
queue.Enqueue(temp.leftChild);
if(temp.rightChild!=null)
queue.Enqueue(temp.rightChild);
}
}
public void Search(int data, out Tree p, out Tree q)
{
p = this;
q = null;
while (p != null)
{
q = p;
if (p._data>data)
p = p.leftChild;
else if (p._data < data)
p = p.rightChild;
else
break;
}
}
public bool InsertNode(int data)
{
Tree newNode = new Tree(data);
Tree p,q;
Search(data, out p, out q);
if (p!= null)
return true;
else
{
if (q._data >data)
q.leftChild =newNode;
else
q.rightChild = newNode ;
}
return false;
}
public void PreOrderWithouIreration()
{
Tree temp;
temp = this;
Stack<Tree> stack=new Stack<Tree>();
stack.Push(this);
while (stack.Count != 0)
{
temp = stack.Pop();
Console.Write("{0} ", temp._data);
if (temp.rightChild!=null)
stack.Push(temp.rightChild);
if (temp.leftChild!=null)
stack.Push(temp.leftChild);
}
}
}
class Program
{
static void Main(string[] args)
{
Tree Root = new Tree(10);
Root.InsertNode(5);
Root.InsertNode(14);
Root.InsertNode(9);
Root.InsertNode(13);
Root.InsertNode(8);
Console.WriteLine("pre order");
Root.PreOrder();
Console.WriteLine("pre order without iteration\n");
Root.PreOrderWithouIreration();
Console.WriteLine("\nIn order");
Root.InOrder();
Console.WriteLine("\nInOrder without Iteration");
Root.InOrderWithoutIretation();
Console.WriteLine("\nPost Order:");
Root.PostOrder();
Console.WriteLine("\nPost Order without Iteration");
Root.PostOrderWithoutIretation();
Console.WriteLine("\nlevel order");
Root.LevelOrder();
Console.Read();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace DS
{
public class Tree
{
public Tree(int data)
{
_data = data;
leftChild = null;
rightChild = null;
}
private int _data;
private Tree leftChild;
private Tree rightChild;
public void PreOrder()
{
if(this != null)
{
Console.Write("{0} ", _data);
if(leftChild!=null)
leftChild.PreOrder();
if(rightChild!=null)
rightChild.PreOrder();
}
}
public void InOrder()
{
if (this != null)
{
if (leftChild != null)
leftChild.InOrder();
Console.Write("{0} ", _data);
if (rightChild != null)
rightChild.InOrder();
}
}
public void PostOrder()
{
if (this != null)
{
if (leftChild != null)
leftChild.PostOrder();
if (rightChild != null)
rightChild.PostOrder();
Console.Write("{0} ", _data);
}
}
public void PostOrderWithoutIretation()
{
Stack<Tree> stack = new Stack<Tree>();
Tree pre=null, temp;
temp=this;
while (temp != null || stack.Count != 0)
{
while (temp != null)
{
stack.Push(temp);
temp = temp.leftChild;
}
temp = stack.First<Tree>();
if (temp.rightChild == null || temp.rightChild==pre)
{
temp=stack.Pop();
Console.Write("{0} ", temp._data);
pre = temp;
temp = null;
}
else
{
temp = temp.rightChild;
}
}
}
public void InOrderWithoutIretation()
{
Stack<Tree> stack = new Stack<Tree>();
Tree temp;
temp = this;
while (temp!=null || stack.Count != 0)
{
while (temp != null)
{
stack.Push(temp);
temp = temp.leftChild;
}
temp = stack.Pop();
Console.Write(" {0} ", temp._data);
temp = temp.rightChild;
}
}
public void LevelOrder()
{
Queue<Tree> queue = new Queue<Tree>();
queue.Enqueue(this);
Tree temp;
while (queue.Count != 0)
{
temp=queue.Dequeue();
Console.Write("{0} ", temp._data);
if(temp.leftChild!=null)
queue.Enqueue(temp.leftChild);
if(temp.rightChild!=null)
queue.Enqueue(temp.rightChild);
}
}
public void Search(int data, out Tree p, out Tree q)
{
p = this;
q = null;
while (p != null)
{
q = p;
if (p._data>data)
p = p.leftChild;
else if (p._data < data)
p = p.rightChild;
else
break;
}
}
public bool InsertNode(int data)
{
Tree newNode = new Tree(data);
Tree p,q;
Search(data, out p, out q);
if (p!= null)
return true;
else
{
if (q._data >data)
q.leftChild =newNode;
else
q.rightChild = newNode ;
}
return false;
}
public void PreOrderWithouIreration()
{
Tree temp;
temp = this;
Stack<Tree> stack=new Stack<Tree>();
stack.Push(this);
while (stack.Count != 0)
{
temp = stack.Pop();
Console.Write("{0} ", temp._data);
if (temp.rightChild!=null)
stack.Push(temp.rightChild);
if (temp.leftChild!=null)
stack.Push(temp.leftChild);
}
}
}
class Program
{
static void Main(string[] args)
{
Tree Root = new Tree(10);
Root.InsertNode(5);
Root.InsertNode(14);
Root.InsertNode(9);
Root.InsertNode(13);
Root.InsertNode(8);
Console.WriteLine("pre order");
Root.PreOrder();
Console.WriteLine("pre order without iteration\n");
Root.PreOrderWithouIreration();
Console.WriteLine("\nIn order");
Root.InOrder();
Console.WriteLine("\nInOrder without Iteration");
Root.InOrderWithoutIretation();
Console.WriteLine("\nPost Order:");
Root.PostOrder();
Console.WriteLine("\nPost Order without Iteration");
Root.PostOrderWithoutIretation();
Console.WriteLine("\nlevel order");
Root.LevelOrder();
Console.Read();
}
}
}