考研級《計算機網路》知識梳理——第三期
阿新 • • 發佈:2021-12-16
對於這種問題,我們第一個需要考慮的問題是:如何對二叉樹進行層次遍歷。可以使用佇列來對二叉樹進行層次遍歷,先將根結點入隊,然後進入while迴圈,每次出隊一個節點進行操作,然後把它對應的左節點和右節點入隊(注意順序不能變)。
然後,我們第二個需要考慮的問題是:怎麼樣把遍歷次數限制在一行內。如果我們不進行特殊處理的話,遍歷的順序是:3,9,20,15,7。 但是我們現在需要的是 [3] [20,9] [15,7],也就是每次只能遍歷一行。 為了解決這個問題,我們可以在 while迴圈中 加入一個 for迴圈,這樣就可以把遍歷限制在一行裡。
for(int i=q.size();i>0;i--){ //q.size()是初始化條件 TreeNode p= q.poll(); list.add(p.val); //對節點進行操作 if(p.left!=null){ q.add(p.left); } if(p.right!=null){ q.add(p.right); } }
接著,我們第三個需要考慮的問題是:如何反轉list中的元素。我們根據題目要求,偶數次的遍歷需要反著來。對於這個問題,我們可以用 Collections 的 reverse方法 ,使list中的元素逆轉(注意List是一個介面,我們可以用 ArrayList實現類)。
class Solution { public List<List<Integer>> levelOrder(TreeNode root) { int count=1;//從第一次遍歷開始 List<List<Integer>> res = new ArrayList<>(); Queue<TreeNode> q = new LinkedList<>();if(root!=null){ q.add(root); //根節點入隊 } while(!q.isEmpty()){ List<Integer> list = new ArrayList<>(); for(int i=q.size();i>0;i--){ //限制遍歷次數 TreeNode p = q.poll(); list.add(p.val); if(p.left!=null){ q.add(p.left); } if(p.right!=null){ q.add(p.right); } } if(count%2==0){ Collections.reverse(list); //需要特殊處理的行 } res.add(list); count++; } return res; } }