二叉树相关算法

节点:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> class Node < T >
{
public TValue{ get ; set ;}

public Node < T > Left{ get ; set ;}

public Node < T > Right{ get ; set ;}

public Node(Tvalue,Node < T > left,Node < T > right)
{
Value
= value;
Left
= left;
Right
= right;
}

public Node(Tvalue): this (value, null , null ){}
}

二叉树:

前中后深度优先遍历非递归,上到下(下到上)宽度优先遍历非递归,输出某层,获取深度

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> class BinaryTree < T >
{
protected IComparer < T > comparer = Comparer < T > .Default;

public Node < T > Root{ get ; set ;}

public void Clear()
{
Root
= null ;
}

public void PreOrder()
{
if (Root == null )
return ;

Stack
< Node < T >> stack = new Stack < Node < T >> ();
stack.Push(Root);

while (stack.Count > 0 )
{
Node
< T > node = stack.Pop();
Console.Write(node.Value
+ " " );
if (node.Right != null )
stack.Push(node.Right);
if (node.Left != null )
stack.Push(node.Left);
}
}

public void MidOrder()
{
if (Root == null )
return ;

Stack
< Node < T >> stack = new Stack < Node < T >> ();
for (Node < T > current = Root;current != null || stack.Count > 0 ;current = current.Right)
{
while (current != null )
{
stack.Push(current);
current
= current.Left;
}

current
= stack.Pop();
Console.Write(current.Value
+ " " );
}
}

public void AfterOrder()
{
if (Root == null )
return ;
Stack
< Node < T >> toVisit = new Stack < Node < T >> ();
Stack
< bool > hasBeenProcessed = new Stack < bool > ();
Node
< T > current = Root;
if (current != null )
{
toVisit.Push(current);
hasBeenProcessed.Push(
false );
current
= current.Left;
}

while (toVisit.Count != 0 )
{
if (current != null )
{
toVisit.Push(current);
hasBeenProcessed.Push(
false );
current
= current.Left;
}
else
{
bool processed = hasBeenProcessed.Pop();
Node
< T > node = toVisit.Pop();
if ( ! processed)
{
toVisit.Push(node);
hasBeenProcessed.Push(
true );
current
= node.Right;
}
else
Console.WriteLine(node.Value
+ " " );
}
}
}

public void UpDownOrder()
{
if (Root == null )
return ;
Queue
< Node < T >> queue = new Queue < Node < T >> ();
queue.Enqueue(Root);

while (queue.Count > 0 )
{
Node
< T > node = queue.Dequeue();
Console.Write(node.Value
+ " " );
if (node.Left != null )
queue.Enqueue(node.Left);
if (node.Right != null )
queue.Enqueue(node.Right);
}
}

public void DownUpOrder()
{
if (Root == null )
return ;
Queue
< Node < T >> queue = new Queue < Node < T >> ();
queue.Enqueue(Root);
Stack
< Node < T >> stack = new Stack < Node < T >> ();
while (queue.Count > 0 )
{
Node
< T > node = queue.Dequeue();
stack.Push(node);
if (node.Left != null )
queue.Enqueue(node.Left);
if (node.Right != null )
queue.Enqueue(node.Right);
}
int c = stack.Count;
for ( int i = 0 ;i < c;i ++ )
{
Console.Write(stack.Pop().Value
+ " " );
}
}

public void PrintNodeAtLevel( int level)
{
if (level == 0 )Console.Write(Root.Value + " " );
PrintNodeAtLevel(Root,level);
}

private void PrintNodeAtLevel(Node < T > node, int level)
{
if (node == null || level < 0 )
return ;
if (level == 0 )
{
Console.Write(node.Value
+ " " );
return ;
}
PrintNodeAtLevel(node.Left,level
- 1 );
PrintNodeAtLevel(node.Right,level
- 1 );
}

public int GetDepth()
{
if (Root == null )
return 0 ;
return GetDepth(Root);
}

private int GetDepth(Node < T > node)
{
if (node == null ) return 0 ;
int l = GetDepth(node.Left);
int r = GetDepth(node.Right);
return Math.Max(l,r) + 1 ;
}
}

搜索二叉树:

搜索、包含、增加删除、获取父节点

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> class BinarySearchTree < T > :BinaryTree < T >
{
public Node < T > Search(Tdata)
{
Node
< T > current = Root;
while (current != null )
{
int result = comparer.Compare(current.Value,data);
if (result == 0 )
return current;
else if (result > 0 )
current
= current.Left;
else if (result < 0 )
current
= current.Right;
}
return current;
}

public bool Contains(Tdata)
{
Node
< T > current = Root;
int result;
while (current != null )
{
result
= comparer.Compare(current.Value,data);
if (result == 0 )
return true ;
else if (result > 0 )
current
= current.Left;
else if (result < 0 )
current
= current.Right;
}
return false ;
}

public Node < T > GetParent(Node < T > node)
{
Node
< T > current = base .Root,parent = null ;
while (current != null )
{
int result = comparer.Compare(current.Value,node.Value);
if (result == 0 )
return parent;
else if (result > 0 )
{
parent
= current;
current
= current.Left;
}
else if (result < 0 )
{
parent
= current;
current
= current.Right;
}
}
return parent;
}

public void Add(Tdata)
{
Node
< T > n = new Node < T > (data);
int result;

Node
< T > current = base .Root,parent = null ;
while (current != null )
{
result
= comparer.Compare(current.Value,data);
if (result == 0 )
return ;
else if (result > 0 )
{
parent
= current;
current
= current.Left;
}
else if (result < 0 )
{
parent
= current;
current
= current.Right;
}
}

if (parent == null )
base .Root = n;
else
{
result
= comparer.Compare(parent.Value,data);
if (result > 0 )
parent.Left
= n;
else
parent.Right
= n;
}
}

public bool Remove(Tdata)
{
if ( base .Root == null )
return false ;

Node
< T > current = base .Root,parent = null ;
int result = comparer.Compare(current.Value,data);
while (result != 0 )
{
if (result > 0 )
{
parent
= current;
current
= current.Left;
}
else if (result < 0 )
{
parent
= current;
current
= current.Right;
}

if (current == null )
return false ;
else
result
= comparer.Compare(current.Value,data);
}

if (current.Right == null )
{
if (parent == null )
base .Root = current.Left;
else
{
result
= comparer.Compare(parent.Value,current.Value);
if (result > 0 )
parent.Left
= current.Left;
else if (result < 0 )
parent.Right
= current.Left;
}
}

else if (current.Right.Left == null )
{
current.Right.Left
= current.Left;

if (parent == null )
base .Root = current.Right;
else
{
result
= comparer.Compare(parent.Value,current.Value);
if (result > 0 )
parent.Left
= current.Right;
else if (result < 0 )
parent.Right
= current.Right;
}
}
else
{
Node
< T > leftmost = current.Right.Left,lmParent = current.Right;
while (leftmost.Left != null )
{
lmParent
= leftmost;
leftmost
= leftmost.Left;
}

lmParent.Left
= leftmost.Right;

leftmost.Left
= current.Left;
leftmost.Right
= current.Right;

if (parent == null )
base .Root = leftmost;
else
{
result
= comparer.Compare(parent.Value,current.Value);
if (result > 0 )
parent.Left
= leftmost;
else if (result < 0 )
parent.Right
= leftmost;
}
}

current.Left
= current.Right = null ;
current
= null ;

return true ;
}
}

你可能感兴趣的:(算法)