面试题_BFs(广度优先算法,或者二叉树顺序输出)

最近参与面试常常问道关于算法方面的题1.:按照图例实现算法;
分析题得到:明显是广度优先算法(BFS算法),利用队列的方式【进队列– 取值– 出队列(判断有无子节点)–所有直接子节点进队列】
这里写图片描述

创建节点类

/**
 * 创建树类
 * @author cc_小白成长
 *
 */
class TreeNode{
    public Integer value;//值
    public TreeNode leftTree; // 左节点
    public TreeNode rightTree; // 右节点
    //构造方法
    public TreeNode(int value){
        this.value = value;
    } 
}

创建对象/与算法实现

/**
 * 测试数相关方法
 * @author cc_小白成长
 *
 */
public class TestBFs {
    public static void main(String[] args) {
        //创建一个简单的二叉树
         TreeNode root = new TreeNode(1);
         root.leftTree = new TreeNode(2);
         root.leftTree.leftTree = new TreeNode(4);
         root.leftTree.rightTree = new TreeNode(5);
         root.rightTree = new TreeNode(3);
         root.rightTree.leftTree  = new TreeNode(6);
         root.rightTree.rightTree = new TreeNode(7);

         TestBFs tb = new TestBFs();
         //调用方法
         tb.BFs(root);
     }

    /**
     * BFS需要用队列去实现。
     * @param root 树的根节点
     */
    public void BFs(TreeNode root){
        // 判断树是否为空 为空则直接返回
         if(root==null) return;

         //创建链表   利用泛型
         LinkedList<TreeNode> list = new LinkedList<TreeNode>();  
         //把根节点添加到链表中
         list.add(root);

         //用于每一次临时存放链表poll出的节点  **一次创建多次使用
         TreeNode currentNode;
         while(!list.isEmpty()){//循环判断链表是否有值
            currentNode=list.poll();  //注意方法poll/peek的区别
            System.out.print(currentNode.value+"\t");
            if(currentNode.leftTree!=null){//判断树有没有左节点
                list.add(currentNode.leftTree);//重点 子节点进队列
            }
            if(currentNode.rightTree!=null){//判断树有没有右节点
                list.add(currentNode.rightTree);//重点 子节点进队列
            }
            //这里同理可以适用用于n叉树
         }
    }
}

测试结果:
这里写图片描述

到此广度优先算法实现,结束;注意广度优先首先考虑到利用队列的特性(先进先出)去实现该算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值