我试图将一棵二叉树分开,并将所有分支的列表作为列表返回。问题是从列表中删除较旧的元素,这样我就不会以其他分支的节点作为结局。
我已经递归地解决了这个问题,但是将相同的逻辑转换为迭代确实使我感到困难。我已经尝试过使用类似标志的方法,即通过推动节点来指示何时使用了所有叶子,并尝试使用第二种数据结构来存储每个节点有多少个子节点,但产生的子节点并不多。
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;
}