劍指Offer | 32 - 3 之字形打印二叉樹

請實現(xiàn)一個函數(shù)按照之字形順序打印二叉樹,即第一行按照從左到右1的順序打印,第二層按照從右到左的順序打印,第三行再按照從左到右的1順序打印,其他行以此類推。

?
例如:下面一棵二叉樹:

?
按照之字形打印的結(jié)果:
?

?

分析:

規(guī)律:按之字形順序打印二叉樹需要兩個棧。我們在打印某一層的節(jié)點時,把下一層的子節(jié)點保存到相應(yīng)的棧里。

如果當(dāng)前打印的是奇數(shù)層(第一層、第三層等),則先保存左子節(jié)點再保存右子節(jié)點到第一個棧里;

如果當(dāng)前打印的是偶數(shù)層(第二層、第四層等),則先保存右子節(jié)點再保存左子節(jié)點到第二個棧里。

?
由此代碼為:
?

import java.util.Stack;

/*按之字形打印二叉樹*/
public class Solution_32_03 {
    //之字形打印二叉樹的函數(shù)
    public static void Print(TreeNode pRoot) {
        if (pRoot == null) {//當(dāng)節(jié)點為空時
            return ;
        }
        
        //存奇數(shù)層的節(jié)點
        Stack<TreeNode> stack1 = new Stack<TreeNode>();
        
        //存偶數(shù)層的節(jié)點
        Stack<TreeNode> stack2 = new Stack<TreeNode>();

        //層數(shù)
        int layer = 1;
        
        //將根結(jié)點先 push 進(jìn) stack1 中
        stack1.push(pRoot);

        // stack1 或 stack2 有一個不為空時,執(zhí)行下面的代碼
        while (!stack1.isEmpty() || !stack2.isEmpty()) {
            
            if (layer % 2 != 0) {//當(dāng)前層數(shù)為奇數(shù)層
               
                while (!stack1.isEmpty()) {//消耗 stack1 中的節(jié)點
                 
                    TreeNode node = stack1.pop();
                    System.out.print(node.val+" , ");
                    
                    //如果當(dāng)前層為奇數(shù)層,則它子節(jié)點進(jìn)棧的順序是:左孩子先進(jìn),右孩子再進(jìn)
                    if (node.left != null) {
                        stack2.push(node.left);
                    }
                  
                    if (node.right != null) {
                        stack2.push(node.right);
                    }
                }
             
                //當(dāng)前層的節(jié)點消耗完成,層數(shù)加 1
                layer++;
                //換行
                System.out.println();

            }else {//當(dāng)前層數(shù)為偶數(shù)層
             
                while (!stack2.isEmpty()) {//消耗 stack2 中的節(jié)點
                    
                    TreeNode node = stack2.pop();
                    System.out.print(node.val+" , ");

                    //如果當(dāng)前層為偶數(shù)層,則它子節(jié)點進(jìn)棧的順序是:右孩子先進(jìn),左孩子再進(jìn)
                    if (node.right != null) {
                        stack1.push(node.right);
                    }
                    
                    if (node.left != null) {
                        stack1.push(node.left);
                    }
                }
              
                //當(dāng)前層的節(jié)點消耗完成,層數(shù)加 1
                layer++;
                 //換行
                System.out.println();
            }
        }
    }



    //二叉樹的節(jié)點
    public static class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

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

        }

    }


    //測試主函數(shù)
    public static void main(String[] args) {
        TreeNode root1 = new TreeNode(1);
        root1.left = new TreeNode(2);
        root1.right = new TreeNode(3);
        root1.left.left = new TreeNode(4);
        root1.left.right = new TreeNode(5);
        root1.right.left = new TreeNode(6);
        root1.right.right = new TreeNode(7);
        root1.left.left.left = new TreeNode(8);
        root1.left.left.right = new TreeNode(9);
        root1.left.right.left = new TreeNode(10);
        root1.left.right.right = new TreeNode(11);
        root1.right.left.left = new TreeNode(12);
        root1.right.left.right = new TreeNode(13);
        root1.right.right.left = new TreeNode(14);
        root1.right.right.right = new TreeNode(15);
        
        Solution_32_03.Print(root1);

    }
}

?
輸出結(jié)果:
?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容