展平二叉树,将分支作为列表返回

时间:2019-03-26 05:49:54

标签: java

我试图将一棵二叉树分开,并将所有分支的列表作为列表返回。问题是从列表中删除较旧的元素,这样我就不会以其他分支的节点作为结局。

我已经递归地解决了这个问题,但是将相同的逻辑转换为迭代确实使我感到困难。我已经尝试过使用类似标志的方法,即通过推动节点来指示何时使用了所有叶子,并尝试使用第二种数据结构来存储每个节点有多少个子节点,但产生的子节点并不多。

EDIT2:

现在我意识到,最初,我发布的问题只包含迭代的版本,而对于不良解决方案的解释却很糟糕。

我当前针对此问题的代码如下。我现在有两个主要问题:1)是否可以在没有跟踪孩子的辅助堆栈的情况下进行操作;以及2)如果我理解正确,运行时间为O(N),空间为O( logN),对吗?非常感谢你。

(主要的困惑是,对于最后一个分支,最里面的while循环必须沿着辅助堆栈向上最右边的分支迭代O(logN)次。)

class TreeNode
{
    int value;
    TreeNode left;
    TreeNode right;

    TreeNode(int value) { this.value = value; }
}

    public List<List<Integer>> Solution(TreeNode root)
    {
        if (root == null) { return null; }

        List<List<Integer>> ret = new ArrayList();
        List<Integer> temp = new ArrayList();
        Stack<TreeNode> stack = new Stack();
        Stack<Integer> aux = new Stack();
        stack.push(root);

        while (!stack.isEmpty())
        {
            int child = 0;
            TreeNode node = stack.pop();
            temp.add(node.value);
            if (node.right != null) {
                stack.push(node.right);
                child++;
            }
            if (node.left != null) {
                stack.push(node.left);
                child++;
            }
            aux.push(child);
            if ((node.left == null) && (node.right == null)) {
                ret.add(new ArrayList<Integer>(temp));
                while ((!aux.isEmpty()) && (aux.peek() - 1) <= 0)
                {
                    temp.remove(temp.size() - 1);
                    aux.pop();
                }
                if (!aux.isEmpty()) { aux.push(aux.pop() - 1); }
            }
        }

        return ret;
    }

0 个答案:

没有答案