面試題_BFs(廣度優先演算法,或者二叉樹順序輸出)
阿新 • • 發佈:2018-12-31
最近參與面試常常問道關於演算法方面的題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叉樹
}
}
}
測試結果:
到此廣度優先演算法實現,結束;注意廣度優先首先考慮到利用佇列的特性(先進先出)去實現該演算法。