36.層次遍歷二叉樹

題目:從上往下打印出二叉樹的每個節點,同層節點從左至右打印。

解析:
1.所有節點全部放入一個List中
①創建隊列Queue,開始將根節點add進隊裏中;
②取出隊列中的結點,將該節點加入List中;
③再將該節點的左、右結點add進Queue隊列中;
④循環②③步驟,直到Queue隊列爲空,所有節點全部被添加進List中;

public ArrayList<Integer> PrintFromTopToBottom(TreeNode root){
  ArrayList<Integer> list = new ArrayList<Integer>();
  Queue<TreeNode> queue = new LinkedList<TreeNode>();
  queue.add(root);//根節點入隊列
  while ( !queue.isEmpty()){
   TreeNode node = queue.poll();//取出隊列的頭部結點元素
   if (node.left != null){
    queue.add(node.left);//向隊列尾部加入取出結點的左節點
   }
   if (node.right != null){
    queue.add(node.right);//向隊列尾部加入取出結點的右節點
   }
   list.add(node.val);
  }
  return list;
 }

2.將每一層結點放入一個List當中
①創建隊列Queue,將根節點放入Queue中;
②獲取當前Queue隊列的元素個數size;
③將隊列Queue中的size個元素出隊列,將這size個元素具有的左右結點壓入隊列Queue中同時將這size個元素加入新建的List中。
④循環步驟②③,直到隊列爲空;

public List<List<Integer>> levelOrder(TreeNode root) {
  List<List<Integer>> list = new ArrayList<List<Integer>>();
  if (root == null)   return list;
  Queue<TreeNode> queue = new LinkedList<TreeNode>();
  queue.add(root);
  while ( ! queue.isEmpty()){
   List<Integer> list0 = new ArrayList<Integer>();
   int size = queue.size();//每一層的結點個數
   //將當前層的結點彈出,並加入list0中,同時下一層的結點壓入隊列中,
   while (size > 0){
    TreeNode node = queue.poll();//隊列頭彈出
    if (node.left != null){
     queue.add(node.left);
    }
    if (node.right != null){
     queue.add(node.right);
    }
    list0.add(node.val);
    size--;
   }
   list.add(list0);
  }
  return list;
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章