1. 程式人生 > >劍指offer——按之字形順序列印二叉樹

劍指offer——按之字形順序列印二叉樹

問題描述:

請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

思路:

之字形列印其實與上一個按層次列印基本相同,唯一不同的是每一層的順序不一樣,所以在這裡可以定義一個變數,列印一層之後將其與1異或,作為列印順序的標誌位。

程式碼實現:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> resultList = new ArrayList<ArrayList<Integer>>(); if(pRoot==null) return resultList; //建立一個佇列用於儲存需要列印的結點 Queue<TreeNode> nodeQueue = new
LinkedList<TreeNode>(); int nextNum =0; //本層已經列印的數量 int toBePrint = 1; //本層需要列印的總數量 int isLeftToRight = 0;//用來判斷方向 nodeQueue.add(pRoot); ArrayList<Integer> result = new ArrayList<Integer>(); while(!nodeQueue.isEmpty()){ TreeNode curNode = nodeQueue.poll(); result.add(curNode.val); nextNum++; if
(curNode.left!=null) nodeQueue.add(curNode.left); if(curNode.right!=null) nodeQueue.add(curNode.right); //判斷本層是否列印完畢 if(nextNum == toBePrint){ if(isLeftToRight==1){ resultList.add(reverse(result)); }else{ resultList.add(result); } toBePrint = nodeQueue.size(); nextNum = 0; result = new ArrayList<Integer>(); isLeftToRight = isLeftToRight^1; } } return resultList; } private ArrayList<Integer> reverse(ArrayList<Integer> result){ ArrayList<Integer> reverseResult = new ArrayList<Integer>(); for(int i=result.size()-1;i>=0;i--){ reverseResult.add(result.get(i)); } return reverseResult; } }