剑指offer—32_3.按之字形顺序打印二叉树—分析及代码(Java)

剑指offer——32_3.按之字形顺序打印二叉树——分析及代码[Java]

一、题目

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

二、分析及代码

1. 辅助栈

(1)思路

设计两个辅助栈,将根结点放入其中一个栈后,依次一边将栈中结点弹出,一边将其子结点按所需的打印顺序弹入另一个辅助栈中。两个栈交替弹出、弹入,直至完成打印。

(2)代码

import java.util.ArrayList;
import java.util.Stack;

/*
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> > ans = new ArrayList<ArrayList<Integer>>();
        if (pRoot == null)
            return ans;
        Stack<TreeNode> sta1 = new Stack<>();
        Stack<TreeNode> sta2 = new Stack<>();
        sta1.add(pRoot);
        while (!sta1.empty() || !sta2.empty()) {
    
    
            if (!sta1.empty()) {
    
    
                ArrayList<Integer> row1 = new ArrayList<>();
                while(!sta1.empty()) {
    
    
                    TreeNode node1 = sta1.pop();
                    row1.add(node1.val);
                    if (node1.left != null)
                        sta2.add(node1.left);
                    if (node1.right != null)
                        sta2.add(node1.right);
                }
                ans.add(row1);
            } else {
    
    
                ArrayList<Integer> row2 = new ArrayList<>();
                while(!sta2.empty()) {
    
    
                    TreeNode node2 = sta2.pop();
                    row2.add(node2.val);
                    if (node2.right != null)
                        sta1.add(node2.right);
                    if (node2.left != null)
                        sta1.add(node2.left);
                }
                ans.add(row2);
            }
        }
        return ans;
    }
}

(3)结果

运行时间:14 ms,占用内存:9752 k。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/112341342