NestedInteger 类
NestedInteger 类
所有的 NestedInteger 问题,都是多叉树的问题。
这树,长这样:

(G) Flatten List
递归的很简单,对于每棵 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?