NestedInteger 类

NestedInteger 类

所有的 NestedInteger 问题,都是多叉树的问题。

这树,长这样:

递归的很简单,对于每棵 tree root 都是一个 【左 - 右】 的顺序 dfs 处理其 subtrees.

迭代先试了下 BFS ,发现顺序有问题。靠 Stack 遇到 List 就反向遍历 push 倒是能跑通。

这个迭代写法其实就是自己用 Stack 复现了一遍递归的过程。

就是最简单的 DFS,非常 trivial 的问题。。

从上往下递归可以传参数,自底向上递归传 tuple.

比较诡异的是 [[-1], [[-1]]] 这样的 test case ,第一个 [-1] 的 weight 居然是 2,导致最终结果是 -3 .. 让我觉得这题的 test case 定义有点不清楚。。

于是下面这个 dfs 的代码会出错,因为没正确处理当前 list 也是嵌套的正确 weight. 这段代码的思路是对于每一个位置,其 weight = 其子树的最深距离,但是和原题的定义不一样。

这题的正确理解是,每当看到 Integer,代表这是一个leaf node; 每当看到一个 List,代表这是一个 subtree.

于是乎这题的正确打开姿势其实是,自顶向下 level order 的看,只要下面还有一层,就把当前的所有结果都再加上一遍,起到相乘的效果;这样随着探索的不断深入,就可以正确地得到每层的正确 weight 了,因为每个 node 的 weight = 这个 node 到树最深节点的距离,一个天然的 BFS 问题。

这题当然也有 DFS 解法,要先把图过一遍,侦查好 maxDepth; 然后递归解决的时候,每一层的权重是 maxDepth - curDepth;

居然能一次 AC ,好神奇。。

这题和 BST iterator 很像,因为实际上都是利用 stack + cur 指针做一个 inorder 遍历。

不同之处是,Binary Tree 是双叉的,有个 node 就可以满足输出当前元素 + 寻找下一元素的需要,我们这个情况要复杂一些。

NestedInteger 是一种树状结构,其中每一个是 List 的元素代表一个三角形,下面有自己的子树。

了解了这个结构之后,为了遍历寻找下一个元素,就需要依靠 List 作为一个 Collection interface 里自带的 iterator 了,在这里 iterator 就充当了 BST 里面 cur 指针的地位,用于在树上定位,和寻找下一个元素; 同时 Stack<> 所存储的,就是各个 iterator.

实现过程中要注意的是,test case 会根据 boolean hasNext 决定是否继续输出,而这种结构不同于 binary tree,可能会有 [ [ ] ] 这种情况,此时 stack 里有东西,cur.hasNext() 也返回 true,无法正确得知下面是否真的有元素存在。

所以要在 hasNext 里面执行程序逻辑。

同时对于一个 iterator,如果已经没有新元素了也不必要 push 到 stack 中。

速度超过 80.50% ,下面的代码能 AC

但是我觉得不算很严谨,如果测试用例调用很多次 hasNext(),会对现有的 iterator 造成影响,不应该是正确的。

我比较认同的写法是这种,用内部函数来准备 next() 和 hasNext() API 的返回。

中间的部分改成迭代也很简单,这样就行;

Last updated

Was this helpful?