二叉树的遍历
对于树与二叉树前面概念部分,请移步:
树与二叉树的那点事
什么是二叉树的遍历从二叉树的根节点出发,按照某种方式依次访问二叉树中的所有节点,使每个节点都能被访问一次且只能访问一次。以下有四种遍历方式:
访问顺序
先序遍历 | 1. 访问根节点 |
2. 先序遍历左子节点 | |
3. 先序遍历右子节点 | |
中序遍历 | 1. 中序遍历左子节点 |
2. 访问根节点 | |
3. 中序遍历右子节点 | |
后序遍历 | 1. 后序遍历左子节点 |
2. 后序遍历右子节点 | |
3. 访问根节点 | |
层序遍历 | 逐层从左到右依次遍历 |
举个栗子
对该完全二叉树(上图)使用不同遍历方式进行输出
顺序结构对于一个二叉树,使用顺序结构对存储时,其存储方式是按照数组形式存储的,如下图
class MyTree<T>
{
//保存二叉树的数据
private T[] data;
//计数
private int count = 0;
public MyTree(int size)
{
data = new T[size];
}
//添加数据
public bool Add(T item)
{
if (count >= data.Length) return false;
data[count] = item;
count++;
return true;
}
public void FirstTravel(int startIndex=0){…}
public void MiddleTravel(int startIndex=0){…}
public void LastTravel(int startIndex=0){…}
public void LayerTravel(int startIndex=0){…}
}
先序遍历/// <summary>
/// 先序遍历
/// </summary>
/// <param name=”startIndex”>开始遍历起点</param>
public void FirstTravel(int startIndex=0)
{
//终止条件
if (startIndex >= count) return;
//startIndex是index
//number是相当于编号
int number = startIndex + 1;
Console.Write(data[startIndex]+” “);
int leftChild = number * 2;
int rightChild = number*2 + 1;
FirstTravel(leftChild – 1);
FirstTravel(rightChild – 1);
}
中序遍历/// <summary>
/// 中序遍历
/// </summary>
/// <param name=”startIndex”>开始遍历起点</param>
public void MiddleTravel(int startIndex=0)
{
//终止条件
if (startIndex >= count) return;
//startIndex是index
//number是相当于编号
int number = startIndex + 1;
int leftChild = number * 2;
int rightChild = leftChild + 1;
MiddleTravel(leftChild-1);
Console.Write(data[startIndex] + ” “);
MiddleTravel(rightChild-1);
}
后续遍历/// <summary>
/// 后序遍历
/// </summary>
/// <param name=”startIndex”>开始遍历起点</param>
public void LastTravel(int startIndex=0)
{
//终止条件
if (startIndex >= count) return;
//startIndex是index
//number是相当于编号
int number = startIndex + 1;
int leftChild = number * 2;
int rightChild = leftChild + 1;
LastTravel(leftChild-1);
LastTravel(rightChild-1);
Console.Write(data[startIndex]+” “);
}
层序遍历/// <summary>
/// 层序遍历
/// </summary>
/// <param name=”startIndex”>开始遍历起点</param>
public void LayerTravel(int startIndex = 0)
{
for (int i = 0; i < count; i++)
{
Console.Write(data[i] + ” “);
}
}
看下遍历结果result链式结构对于链式结构的先序,中序,后续遍历,过于简单,只需访问根节点的左孩子,右孩子即可,最近刷力扣时遇到链式结构的层序遍历,与顺序结构的有所不同,记录下:
层序遍历思想:
通过使用队列(当然也可以使用列表模拟先进后出的特性),如果根节点不为空,则将根节点入队;从队列中取出一个节点(Temp);如果Temp的左孩子不为空,则将Temp的左子节点入队;如果Temp的右孩子不为空,则将Temp的右子节点入队;如果队列不为空就重复执行2-5步,直到队列为空;主要代码如下:
/// <summary>
/// 将二叉树层序遍历然后保存到列表中返回
/// </summary>
static public int[] LevelOrder(TreeNode root)
{
Queue<TreeNode> queue = new Queue<TreeNode>();
List<int> result = new List<int>();
if (root != null)
{
queue.Enqueue(root);
}
while(queue.Count>0)
{
TreeNode node = queue.Dequeue();
if(node.left!=null)
{
queue.Enqueue(node.left);
}
if(node.right!=null)
{
queue.Enqueue(node.right);
}
result.Add(node.val);
}
return result.ToArray();
}
扫码关注 关注组织,一块学做游戏吧>>阅读原文最下方留言哟<<