public class TreeNode
{
public string val = "";
public TreeNode left = null;
public TreeNode right = null;
public TreeNode(string val)
{
this.val = val;
}
}
广度优先遍历
英文缩写为BFS即Breadth FirstSearch。其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。
广度优先遍历树,需要用到队列(Queue)来存储节点对象,队列的特点就是先进先出。
先往队列中插入左节点,再插右节点,这样出队就是先左节点后右节点了。
public void BFS(TreeNode root)
{
if (root == null)
return;
Queue<TreeNode> queue = new Queue<TreeNode>();
queue.Enqueue(root);
while (queue.Count > 0)
{
var node = queue.Dequeue();
if (node.left != null)
queue.Enqueue(node.left);
if (node.right != null)
queue.Enqueue(node.right);
Debug.LogError($" {node.val} ");
}
}
深度优先遍历
英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
深度优先遍历各个节点,需要使用到栈(Stack)这种数据结构。stack的特点是是先进后出。整个遍历过程如下:
先往栈中压入右节点,再压左节点,这样出栈就是先左节点后右节点了。
public void DFS(TreeNode root)
{
if (root == null)
return;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.Push(root);
while (stack.Count>0)
{
var node = stack.Pop();
if(node.right!=null)
stack.Push(node.right);
if(node.left!=null)
stack.Push(node.left);
Debug.LogError($" {node.val} ");
}
}
//递归写法
public void DFS_Recursion(TreeNode root)
{
Depth(root);
}
public void Depth(TreeNode node)
{
if (node != null)
{
Debug.LogError($" {node.val} ");
Depth(node.left);
Depth(node.right);
}
}
先序遍历
先(根)序遍历(根左右)
public void PreOrderTraversal(TreeNode node)
{
if (node != null)
{
Debug.LogError($"PreOrder {node.val} ");
PreOrderTraversal(node.left);
PreOrderTraversal(node.right);
}
}
中序遍历
中(根)序遍历(左根右)
public void InOrderTraversal(TreeNode node)
{
if (node != null)
{
InOrderTraversal(node.left);
Debug.LogError($"InOrder {node.val} ");
InOrderTraversal(node.right);
}
}
后序遍历
后(根)序遍历(左右根)
public void PostOrderTraversal(TreeNode node)
{
if (node != null)
{
PostOrderTraversal(node.left);
PostOrderTraversal(node.right);
Debug.LogError($"PostOrder {node.val} ");
}
}