老实人解法

按之字形顺序打印二叉树

http://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0

分析题目可以知道,奇数行总是从左到右,偶数行总是从右到左
初步想法就是bfs!
如何从右边到左遍历的同时能够使下一行能够从左到右遍历呢?
可以用栈, 依次从右到左 放子树 放左 右
使用栈存储下一行数据(奇数行总是从左到右,偶数行总是从右到左)
奇数行:扫描当前行存入ArrayList,依次放入每个结点的 左 右 左 右,下一行(偶数行) 栈出栈就是 右 左 右 左
偶数行:扫描当前行存入ArrayList,依次放入每个结点的 右 左 右 左,下一行(奇数行) 栈出栈就是 左 右 左 右
每遍历完成一行存入result

public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if (pRoot == null) {
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        // 使用一个flag来标记是奇数行还是偶数行 奇数行为true,偶数行为false
        boolean flag = true;
        stack.push(pRoot);
        while (stack.size() != 0) {
            ArrayList<Integer> curList = new ArrayList<>();
            ArrayList<TreeNode> curLine = new ArrayList<>();
            while (stack.size() != 0) {
                curLine.add(stack.pop());
            }
            if (flag) {
                for (TreeNode node : curLine) {
                    curList.add(node.val);
                    // 奇数行下一行,先放左后放右
                    if (node.left != null) {
                        stack.push(node.left);
                    }
                    if (node.right != null) {
                        stack.push(node.right);
                    }
                }
            } else {
                for (TreeNode node : curLine) {
                    curList.add(node.val);
                    // 偶数行下一行,先放右后放左
                    if (node.right != null) {
                        stack.push(node.right);
                    }
                    if (node.left != null) {
                        stack.push(node.left);
                    }
                }
            }
            result.add(curList);
            flag = !flag;
        }
        return result;
    }
全部评论

相关推荐

2024-11-21 13:04
已编辑
门头沟学院 算法工程师
点赞 评论 收藏
分享
MScoding:你这个实习有一个是当辅导老师,这个和找技术岗没有关系吧?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务