C # binary tree traversal C # recursive and non-recursive binary tree traversal. Btreenode is a node class, and visited is an Enum type that indicates whether the current node is accessed and whether the accessed node is left or right (used for non-recursive post-order traversal). btree is a binary tree class, previsit, invisit, and backvisit are pre-and post-order traversal of recursion, previsit1, invisit1, and backvisit1 are pre-and post-order traversal of non-recursion respectively.
Public Enum visited
{
None,
Left,
Right
}
Public class btreenode
{
Public btreenode left;
Public btreenode right;
Public int data;
Public visited;
}
Public class btree
{
Public btreenode;
Public stack <btreenode> nodestack = new stack <btreenode> ();
Public btree (btreenode node)
{
This. btreenode = node;
}
Public void previsit (btreenode node)
{
Visit (node );
If (node! = NULL)
{
Previsit (node. Left );
Previsit (node. Right );
}
}
Public void invisit (btreenode node)
{
If (node! = NULL)
Invisit (node. Left );
Visit (node );
If (node! = NULL)
Invisit (node. Right );
}
Public void backvisit (btreenode node)
{
If (node! = NULL)
{
Backvisit (node. Left );
Backvisit (node. Right );
}
Visit (node );
}
Public void previsit1 (btreenode node)
{
While (node! = NULL | nodestack. Count> 0)
{
If (node = NULL)
{
Node = nodestack. Pop ();
If (node. Right! = NULL)
{
Visit (node. Right );
Nodestack. Push (node. Right );
}
Node = NULL;
}
Else
{
Visit (node );
Nodestack. Push (node );
Node = node. Left;
}
}
}
Public void invisit1 (btreenode node)
{
While (node! = NULL | nodestack. Count> 0)
{
If (node = NULL)
{
Node = nodestack. Pop ();
Visit (node );
If (node. Right! = NULL)
{
Nodestack. Push (node. Right );
}
Node = NULL;
}
Else
{
Nodestack. Push (node );
Node = node. Left;
}
}
}
Public void backvisit1 (btreenode node)
{
While (node! = NULL | nodestack. Count> 0)
{
If (node = NULL)
Node = nodestack. Peek ();
If (node. Visited = visited. None)
{
Node. Visited = visited. Left;
Nodestack. Push (node );
Node = node. Left;
}
Else if (node. Visited = visited. Left)
{
Node. Visited = visited. Right;
Nodestack. Pop ();
Nodestack. Push (node );
Node = node. Right;
}
Else if (node. Visited = visited. Right)
{
Visit (node );
Nodestack. Pop ();
Node = NULL;
}
}
}
Private void visit (btreenode node)
{
If (node! = NULL)
Console. Out. Write ("" + node. data );
}
}
The following is the construction tree and Test method: btreenode node1 = new btreenode ();
Node1.data = 3;
Node1.visited = visited. None;
Btreenode node2 = new btreenode ();
Node2.data = 4;
Node2.visited = visited. None;
Btreenode node3 = new btreenode ();
Node3.data = 7;
Node3.visited = visited. None;
Btreenode node4 = new btreenode ();
Node4.data = 5;
Node4.visited = visited. None;
Btreenode node5 = new btreenode ();
Node5.data = 2;
Node5.visited = visited. None;
Btreenode node6 = new btreenode ();
Node6.data = 9;
Node6.visited = visited. None;
Node1.left = node2;
Node1.right = node3;
Node2.left = node4;
Node2.right = node5;
Node3.right = node6;
Btree = new btree (node1 );
Console. Write ("pre-order recursive traversal :");
Btree. previsit (btree. btreenode );
Console. writeline ("");
Console. Write ("pre-order non-recursive traversal :");
Btree. previsit1 (btree. btreenode );
Console. writeline ("");
Console. Write ("recursive traversal in the middle order :");
Btree. invisit (btree. btreenode );
Console. writeline ("");
Console. Write ("ordinal non-recursive traversal :");
Btree. invisit1 (btree. btreenode );
Console. writeline ("");
Console. Write ("recursive post-order traversal :");
Btree. backvisit (btree. btreenode );
Console. writeline ("");
Console. Write ("non-recursive post-order traversal :");
Btree. backvisit1 (btree. btreenode );
Console. writeline ("");
Console. Read ();
C # binary tree traversal