文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>《编程之美》-逐层遍历二叉树

《编程之美》-逐层遍历二叉树

时间:2010-09-05  来源:小伦

   《 编程之美》中有个关于逐层遍历二叉树的算法:

                   

按照书中的算法思想实现如下:

首先定义数据结构:

 

代码
 /// <summary>
/// 结点类
/// </summary>
/// <typeparam name="T">结点包含数据的数据类型</typeparam>
public class Node<T>
{
private T _data;
/// <summary>
/// 结点数据
/// </summary>
public T Data
{
get { return _data; }
set { _data = value; }
}
private Node<T> _right;
/// <summary>
/// 左孩子结点
/// </summary>
public Node<T> Right
{
get { return _right; }
set { _right = value; }
}
private Node<T> _left;
/// <summary>
/// 右孩子结点
/// </summary>
public Node<T> Left
{
get { return _left; }
set { _left = value; }
}


public Node(T data)
{
_data
= data;
}

public Node(T data, Node<T> left, Node<T> right)
{
_data
= data;
_left
= left;
_right
= right;
}


}

1.要逐层打印二叉树的结点,则可以先实现打印该二叉树某一层的算法:

 

代码
        //打印以root为根节点的二叉树的第level层的元素的
void PrintNodeOfLevel(Node<int> root, int level)
{
if (root == null || level < 0)
return;

if (level == 0)
{
Console.Write(root.Data
+" ");
}

if (root.Left != null)
PrintNodeOfLevel(root.Left, level
- 1);

if(root.Right != null)
PrintNodeOfLevel(root.Right, level
- 1);

}

 

2.逐层打印需要知道二叉树的深度:

 

代码
//求二叉树深度
int GetDepth(Node<int> root)
{
//分别求左右子树的深度,通过加1得到该树的深度,分而治之
int ldepth=0, rdepth = 0;

if (root == null)
return 0;
//求左子树的深度(均假设深度已求出)
if (root.Left != null)
ldepth
= GetDepth(root.Left);

//求右子树的深度(均假设深度已求出)
if (root.Right != null)
rdepth
= GetDepth(root.Right);

//关键之处,递归逻辑体(Math.max(ldepth,rdepth)替换之
int temp = 0;
if (ldepth >= rdepth)
temp
= ldepth;
else
temp
= rdepth;
return temp + 1;

}

 

3.最后就是逐层打印该二叉树了:

 

代码
  void PrintBTree(Node<int> root)
{
int depth = GetDepth(root);
for (int i = 0; i < depth; i++)
{
PrintNodeOfLevel(root, i);
Console.Write(
"\n");
}
}

 

这是通过递归是比较耗时的做法,但是不需要额外的空间来计算,下面是通过空间换取时间的做法:

 

代码
  //逐层遍历二叉树,分开层
static void PrintBTreeByBFS(Node<int> root)
{
List
<Node<int>> list = new List<Node<int>>();
list.Add(root);
int current = 0;
int next = 1;
while (current < list.Count)//还有下层
{
next
= list.Count;
while (current < next)//该层还有元素
{
Node
<int> q = list[current];
Console.Write(q.Data
+ " ");

if (q.Left != null)//放入左孩子
list.Add(q.Left);

if (q.Right != null)//放入右孩子
list.Add(q.Right);

current
++;
}
Console.Write(
"\n");
}
}

 

我还想起了逐层遍历二叉树的算法,但是没有不能按照书中的要求把层次分开:

 

代码
        //逐层遍历二叉树,但是没有分开层
static void PrintBTreeByBFS(Node root)
{
Queue
<Node> queue = new Queue<Node>();
queue.Enqueue(root);
while (queue.Count > 0)
{
Node q
= queue.Dequeue();
Console.Write(q.Data
+ " ");

if (q.Left != null)
queue.Enqueue(q.Left);
if (q.Right != null)
queue.Enqueue(q.Right);
}
}

 

复习知识,欢迎拍砖!

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载