最近参与面试常常问道关于算法方面的题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叉树
}
}
}
测试结果:
到此广度优先算法实现,结束;注意广度优先首先考虑到利用队列的特性(先进先出)去实现该算法。