二叉树的深度优先遍历和广度构建以及广度优先遍历
程序员文章站
2022-05-21 19:25:20
...
深度优先遍历
二叉树的深度优先遍历不管是先序中序还是后序都是很简单的,递归遍历即可,放上代码
public static void treeShow(Node tree){
System.out.println(tree.value);
if (tree.right != null){
treeShow(tree.right);
}
if (tree.left != null){
treeShow(tree.left);
}
}
广度优先遍历
前言
二叉树不管是广度的构建以及广度优先遍历都需要用到队列的知识,建议不熟悉队列的先了解一下队列的相关知识。
链接:队列相关知识传送门
思路
给定一个数组,建立二叉树并进行广度优先遍历
构建:建立一个队列,建立一个结点,value是数组的第一个元素的值,把结点放入队列。开始循环,每一次循环从队列中拿出一个结点,然后
新建两个结点作为拿出的结点的左右孩子结点,再从数组中拿出两个值作为两个孩子结点的值。然后把左右孩子结点分别加入队列,照此循环,
最后遍历到数组末尾就可以构建完成二叉树
遍历:建立一个队列,把根节点放入队列,进入循环,循环条件为队列不空。从队列中拿出一个结点,访问结点的值,如果结点有左孩子,
左孩子入队;如果结点有右孩子,右孩子入队。
具体代码
import java.util.LinkedList;
import java.util.Queue;
public class GDTree {
//广度优先遍历树
public static void main(String[] args) {
int[] num = new int[]{12,32,1,65,41,15,645,16,17,1,78,1,145,132};
TreeNode tree = new TreeNode();
tree.value = num[0];
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(tree);
for (int i = 1; i < num.length; i+=2) {
//拿出一个结点并在队列中删除
TreeNode node = queue.poll();
node.left = new TreeNode();
node.left.value = num[i];
queue.offer(node.left);
if (i+1 < num.length) {
node.right = new TreeNode();
node.right.value = num[i+1];
queue.offer(node.right);
}
}
System.out.println(tree);
showTree(tree);
}
private static void showTree(TreeNode tree){
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(tree);
while (!queue.isEmpty()){
tree = queue.poll();
System.out.println(tree.value);
if (tree.left!=null){
queue.offer(tree.left);
}
if (tree.right!=null){
queue.offer(tree.right);
}
}
}
}
class TreeNode{
Integer value;
TreeNode left;
TreeNode right;
@Override
public String toString() {
return "TreeNode{" +
"value=" + value +
", left=" + left +
", right=" + right +
'}';
}
}