用C#实现了二叉树的定义怎么构造一颗已知的二叉树用几种常规的算法(先序中序后序层次)遍历二叉树希望能给有需要人带来帮助也希望能得到大家的指点有关C#数据结构的书在书店里找到网上也是极少如果你有好的学习资源别忘了告诉我先谢了数据结构对一个程序员来说现在是太重要了数据结构学得好的人逻辑思维一定很强在程序设计的时候就不会觉得太费劲了而且是在设计多层应用程序的时候真是让人绞尽脑汁啊趁自己还年轻赶紧练练脑子哈哈咱们尽快进入主题吧
本程序中将用到一棵已知的二叉树如图(二叉树图)所示
下面简单介绍一下几种算法和思路
先序遍历
访问根结点
按先序遍历左子树;
按先序遍历右子树
例如遍历已知二叉树结果为A>B>D>G>H>C>E>F
中序遍历
按中序遍历左子树;
访问根结点
按中序遍历右子树
例如遍历已知二叉树的结果B>G>D>H>A>E>C>F
后序遍历
按后序遍历左子树
按后序遍历右子树
访问根结点
例如遍历已知二叉树的结果G>H>D>B>E>F>C>A
层次遍历
从上到下从左到右遍历二叉树的各个结点(实现时需要借辅助容器)
例如遍历已知二叉树的结果A>B>C>D>E>F>G>H
附加整个解决方案代码
二叉遍历算法解决方案
using System;
using SystemCollectionsGeneric;
using SystemText;
namespace structure
{
class Program
{
二叉树结点数据结构的定义#region 二叉树结点数据结构的定义
//二叉树结点数据结构包括数据域左右结点以及父结点成员
class nodes<T>
{
T data;
nodes<T> Lnode Rnode Pnode;
public T Data
{
set { data = value; }
get { return data; }
}
public nodes<T> LNode
{
set { Lnode = value; }
get { return Lnode; }
}
public nodes<T> RNode
{
set { Rnode = value; }
get { return Rnode; }
}
public nodes<T> PNode
{
set { Pnode = value; }
get { return Pnode; }
}
public nodes()
{ }
public nodes(T data)
{
thisdata = data;
}
}
#endregion
先序编历二叉树#region 先序编历二叉树
static void PreOrder<T>(nodes<T> rootNode)
{
if (rootNode != null)
{
ConsoleWriteLine(rootNodeData);
PreOrder<T>(rootNodeLNode);
PreOrder<T>(rootNodeRNode);
}
}
#endregion
构造一棵已知的二叉树#region 构造一棵已知的二叉树
static nodes<string> BinTree()
{
nodes<string>[] binTree = new nodes<string>[];
//创建结点
binTree[] = new nodes<string>(A);
binTree[] = new nodes<string>(B);
binTree[] = new nodes<string>(C);
binTree[] = new nodes<string>(D);
binTree[] = new nodes<string>(E);
binTree[] = new nodes<string>(F);
binTree[] = new nodes<string>(G);
binTree[] = new nodes<string>(H);
//使用层次遍历二叉树的思想构造一个已知的二叉树
binTree[]LNode = binTree[];
binTree[]RNode = binTree[];
binTree[]RNode = binTree[];
binTree[]LNode = binTree[];
binTree[]RNode = binTree[];
binTree[]LNode = binTree[];
binTree[]RNode = binTree[];
//返回二叉树的根结点
return binTree[];
}
#endregion
中序遍历二叉树#region 中序遍历二叉树
static void MidOrder<T>(nodes<T> rootNode)
{
if (rootNode != null)
{
MidOrder<T>(rootNodeLNode);
ConsoleWriteLine(rootNodeData);
MidOrder<T>(rootNodeRNode);
}
}
#endregion
后序遍历二叉树#region 后序遍历二叉树
static void AfterOrder<T>(nodes<T> rootNode)
{
if (rootNode != null)
{
AfterOrder<T>(rootNodeLNode);
AfterOrder<T>(rootNodeRNode);
ConsoleWriteLine(rootNodeData);
}
}
#endregion
层次遍历二叉树#region 层次遍历二叉树
static void LayerOrder<T>(nodes<T> rootNode)
{
nodes<T>[] Nodes = new nodes<T>[];
int front = ;
int rear = ;
if (rootNode != null)
{
rear++;
Nodes[rear] = rootNode;
}
while (front != rear)
{
front++;
rootNode = Nodes[front];
ConsoleWriteLine(rootNodeData);
if (rootNodeLNode != null)
{
rear++;
Nodes[rear] = rootNodeLNode;
}
if (rootNodeRNode != null)
{
rear++;
Nodes[rear] = rootNodeRNode;
}
}
}
#endregion
测试的主方法#region 测试的主方法
static void Main(string[] args)
{
nodes<string> rootNode = BinTree();
ConsoleWriteLine(先序遍历方法遍历二叉树);
PreOrder<string>(rootNode);
ConsoleWriteLine(中序遍历方法遍历二叉树);
MidOrder<string>(rootNode);
ConsoleWriteLine(后序遍历方法遍历二叉树);
AfterOrder<string>(rootNode);
ConsoleWriteLine(层次遍历方法遍历二叉树);
LayerOrder<string>(rootNode);
ConsoleRead();
}
#endregion
}
}