题解 | #牛群Z字型排列# java

牛群Z字型排列

https://www.nowcoder.com/practice/50ddaf50c6954600a9f1dbb099d6f388

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 {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return int整型二维数组
     */
    public int[][] ZLevelOrder (TreeNode root) {
        // write code here
        List<List<Integer>> res = new ArrayList<>();
        if (root == null)
            return new int[0][0];

        Stack<TreeNode> s1 = new Stack<>();
        Stack<TreeNode> s2 = new Stack<>();
        s1.push(root);

        while (!s1.empty() || !s2.empty()) {
            int n = s1.size();
            TreeNode node = null;
            List<Integer> vec = new ArrayList<>();

            for (int i = 0; i < n; i++) {
                node = s1.pop();
                vec.add(node.val);

                if (node.left != null)
                    s2.push(node.left);
                if (node.right != null)
                    s2.push(node.right);
            }

            if (vec.size() > 0)
                res.add(new ArrayList<>(vec));

            vec.clear();
            n = s2.size();

            for (int i = 0; i < n; i++) {
                node = s2.pop();
                vec.add(node.val);

                if (node.right != null)
                    s1.push(node.right);
                if (node.left != null)
                    s1.push(node.left);
            }

            if (vec.size() > 0)
                res.add(new ArrayList<>(vec));
        }

        int[][] result = new int[res.size()][];
        for (int i = 0; i < res.size(); i++) {
            List<Integer> row = res.get(i);
            result[i] = new int[row.size()];
            for (int j = 0; j < row.size(); j++) {
                result[i][j] = row.get(j);
            }
        }

        return result;
    }
}

代码使用的编程语言是Java。

这道题目考察的是二叉树的层序遍历,要求按照Z字形的顺序输出每一层的节点值。

解决这个问题的思路是使用两个栈s1和s2来分别保存当前层和下一层的节点。首先将根节点入栈s1,并进入循环,直到s1和s2都为空为止。

在每一次循环中,首先判断当前s1栈是否为空,如果不为空,则将s1栈中的节点依次出栈,并将它们的值加入到一个临时列表vec中。同时,如果节点有左孩子,则将左孩子入栈s2;如果节点有右孩子,则将右孩子入栈s2。当s1栈为空时,将vec列表加入到结果列表res中。

清空vec列表,并判断当前s2栈是否为空,如果不为空,则将s2栈中的节点依次出栈,并将它们的值加入到vec列表中。同时,如果节点有右孩子,则将右孩子入栈s1;如果节点有左孩子,则将左孩子入栈s1。当s2栈为空时,将vec列表加入到结果列表res中。

将结果列表res转换为二维数组并返回。

代码通过两个栈的交替使用,实现了按照Z字形顺序遍历二叉树节点的要求。

全部评论

相关推荐

01-30 09:45
燕山大学 Java
喵_coding:这种直接跑就完事了 哪有毕业了才签合同 任何offer和三方都没有的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务