劍指Offer(java語言)--按之字形順序打印二叉樹(樹)

題目:

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

知識點:

二叉樹

思路:

例如:,輸出結果是[[8],[10,6],[5,7,9,11]]

將每層的結點存入Stack中,爲下一層結點的訪問做準備,下一層節點的根節點爲存儲着上一層節點的棧的棧頂。

答案:

import java.util.*;

/*
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<Integer> al = new ArrayList<Integer>();
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        if(pRoot==null){return list;}
        Stack<TreeNode> s1 = new Stack<TreeNode>();//從右向左打印的棧
        Stack<TreeNode> s2 = new Stack<TreeNode>();//從左向右打印的棧
        s1.push(pRoot);//初始節點
        al.add(pRoot.val);
        list.add(al);
        while(!s1.isEmpty()||!s2.isEmpty()){//只要兩個棧都不爲空
            s2 = rToL(list,s1);//將結果棧傳遞給從左向右的函數
            s1 = lToR(list,s2);//將結果棧傳遞給從右向左的函數
        }
        return list;
    }
    public Stack<TreeNode> rToL(ArrayList<ArrayList<Integer>> list,Stack<TreeNode> s1){
        ArrayList<Integer> al = new ArrayList<Integer>();
        Stack<TreeNode> sTmp = new Stack<TreeNode>();
        if(s1.isEmpty()){return sTmp;}
        TreeNode tmp = null;
        while(!s1.isEmpty()){
            tmp = s1.pop();
            if(tmp.right!=null){
                sTmp.push(tmp.right);
                al.add(tmp.right.val);
            }
            if(tmp.left!=null){
                sTmp.push(tmp.left);
                al.add(tmp.left.val);
            }
        }
        if(!al.isEmpty()) {list.add(al);}
        return sTmp;
    }
    public Stack<TreeNode> lToR(ArrayList<ArrayList<Integer>> list,Stack<TreeNode> s2){
        ArrayList<Integer> al = new ArrayList<Integer>();
        Stack<TreeNode> sTmp = new Stack<TreeNode>();
        if(s2.isEmpty()){return sTmp;}
        TreeNode tmp = null;
        while(!s2.isEmpty()){
            tmp = s2.pop();
            if(tmp.left!=null){
                sTmp.push(tmp.left);
                al.add(tmp.left.val);
            }
            if(tmp.right!=null){
                sTmp.push(tmp.right);
                al.add(tmp.right.val);
            }
        }
        if(!al.isEmpty()) {list.add(al);}
        return sTmp;
    }

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章