二叉树的深度优先遍历和广度构建以及广度优先遍历

深度优先遍历

二叉树的深度优先遍历不管是先序中序还是后序都是很简单的,递归遍历即可,放上代码

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 +
                '}';
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值