不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!
树的四种遍历方式
树的遍历方式一般来说有四种:
- 先序遍历
- 中序遍历
- 后序遍历
- 层序遍历
只有层序遍历是属于广度优先搜索,剩下三个都是深度优先搜索的。
先序遍历
以最简单的二叉树进行遍历测试,可能在树的构建上很粗糙,主要表达遍历树的思想。
- 树的结构类
package com.hnu;
//数据结构树,封装
public class TreeNode {
//结点值
public int val;
//左孩子
public TreeNode left;
//右孩子
public TreeNode right;
//结点初始化
public TreeNode(int val) {
this.val = val;
}
}
package com.hnu;
public class Main {
//构造一棵树
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(7);
root.left = node2;
root.right = node3;
node2.left = node4;
node2.right = node5;
node3.left = node6;
node3.right = node7;
preOrderTraversal(root);
}
//先序遍历 根,左孩子,右孩子
public static void preOrderTraversal(TreeNode root){
if(root == null){
return;
}
System.out.print(root.val+" ");
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
}
中序遍历
- 只修改遍历方法即可
//中序遍历 左孩子,根,右孩子
public static void preOrderTraversal(TreeNode root){
if(root == null){
return;
}
preOrderTraversal(root.left);
System.out.print(root.val+" ");
preOrderTraversal(root.right);
}
后序遍历
- 一样修改遍历方法
//后序遍历 左孩子,右孩子,根
public static void preOrderTraversal(TreeNode root){
if(root == null){
return;
}
preOrderTraversal(root.left);
preOrderTraversal(root.right);
System.out.print(root.val+" ");
}
层序遍历
-
因为先进去的结点要先出来,所以采用
队列
辅助遍历package com.hnu; import java.util.*; public class Main { //构造一棵树 public static void main(String[] args) { TreeNode root = new TreeNode(1); TreeNode node2 = new TreeNode(2); TreeNode node3 = new TreeNode(3); TreeNode node4 = new TreeNode(4); TreeNode node5 = new TreeNode(5); TreeNode node6 = new TreeNode(6); TreeNode node7 = new TreeNode(7); root.left = node2; root.right = node3; node2.left = node4; node2.right = node5; node3.left = node6; node3.right = node7; System.out.println(preOrderTraversal(root)); } //层序遍历 每一层的结点遍历 public static List<Integer> preOrderTraversal(TreeNode root){ //辅助遍历 Queue<TreeNode> queue = new LinkedList(); //存储遍历的结点值 List<Integer> array = new ArrayList<>(); //遍历到末尾,返回 if(root == null){ return array; } //加入根 queue.offer(root); //队列不空,一直循环 while(!queue.isEmpty()){ //取出结点 TreeNode cur = queue.poll(); //加入值 array.add(cur.val); //左子树不空就加入队列,实现循环 if(cur.left != null){ queue.offer(cur.left); } //右子树不空就加入队列,实现循环 if(cur.right != null){ queue.offer(cur.right); } } //最后返回遍历后得到的值 return array; } }