Java 展平二叉树,以列表形式返回分支

Java 展平二叉树,以列表形式返回分支,java,Java,我试图将一棵二叉树分解,并将所有分支的列表作为列表返回。问题是从列表中删除较旧的元素,这样我就不会得到来自其他分支的节点 我递归地解决了这个问题,但将相同的逻辑转换为迭代才是真正让我感到困难的地方。我试着使用一些类似于flags的东西,通过按下节点来表示何时使用了所有的叶子,并使用第二个数据结构来存储每个节点有多少子节点,但没有产生多少结果 编辑2: 我现在意识到,最初我发布的问题只有一个被破坏的迭代版本,对于糟糕的解决方案,这是一个非常糟糕的解释 我目前针对这个问题的代码如下。我现在面临的两个

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

我递归地解决了这个问题,但将相同的逻辑转换为迭代才是真正让我感到困难的地方。我试着使用一些类似于flags的东西,通过按下节点来表示何时使用了所有的叶子,并使用第二个数据结构来存储每个节点有多少子节点,但没有产生多少结果

编辑2:

我现在意识到,最初我发布的问题只有一个被破坏的迭代版本,对于糟糕的解决方案,这是一个非常糟糕的解释

我目前针对这个问题的代码如下。我现在面临的两个主要问题是:1)是否有可能在没有跟踪子对象的辅助堆栈的情况下执行此操作,以及2)如果我理解正确,则运行时为O(N),空间为O(logN),这是否正确?多谢各位

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

类树节点
{
int值;
左树突;
特雷诺德右翼;
TreeNode(int值){this.value=value;}
}
公共列表解决方案(TreeNode根目录)
{
如果(root==null){返回null;}
List ret=new ArrayList();
List temp=new ArrayList();
堆栈=新堆栈();
堆栈aux=新堆栈();
栈.推(根);
而(!stack.isEmpty())
{
int child=0;
TreeNode节点=stack.pop();
临时添加(节点值);
if(node.right!=null){
stack.push(node.right);
儿童++;
}
if(node.left!=null){
堆栈推送(节点左);
儿童++;
}
辅助推(儿童);
if((node.left==null)和&(node.right==null)){
ret.add(新阵列列表(临时));

(!aux.isEmpty())&&(aux.peek()-1)您的问题在您的任务定义中:“仅分支”应该是什么意思?仅节点有子节点?仅子节点?两者都有?为什么?如果“仅子节点”:是什么让你认为一个节点不能同时是子节点和父节点?在哪个级别上节点是实际的子节点?最后一个?第一个?一个“其他”分支看起来如何?哪些分支不是“其他”?在我看来,你实际上并不想展平树,而是选择特定的节点……至少你的递归算法是这样做的,但方式很奇怪。对不起,我在解释我希望程序执行的操作时做得很差。另外,树的格式真的很糟糕,我很抱歉。我对它进行了编辑,以便更好地进行压缩不知道它应该做什么。
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;
    }