求解Nary Tree 的Leaf 集合
这道题目考察的核心在于整体树的结构(构建能力) 而不是用到传统的递归.通过模拟遍历顺序, 当前节点, 第一个孩子的孩子, 如果没有孩子,就前往下一个兄弟, 如果没有兄弟,就再前往主线还没有访问过的兄弟
1.firstNode(root)--- 从根节点遍历开始 2. 判断当前节点是不是叶子节点, 加到总和中.
if(isLeaf(cur)){
sum+=cur.val;
}
叶子定义: children ==null|| children.isEmpty();
- 用nextNode(cur) 找到下一个节点; cur=nextNode(cur);
只用parent. children 指针完成遍历.
重点思维: nextNode(cur);
模拟先序遍历, 从当前cur跳到下一个节点
case1: 当前节点有子节点
if(cur.children!=null && !cur.children.isEmpty()){ return cur.children.get(0); }
case2: 当前节点没有孩子->尝试跳到下一个节点
while (cur.parent != null) { TreeNode parent = cur.parent; List siblings = parent.children; int index = siblings.indexOf(cur);
if (index < siblings.size() - 1) {
return siblings.get(index + 1); // 下一个兄弟
}
cur = parent; // 向上跳
}
case3: 一直晚上跳还没找到兄弟 ->到根了
return null;
Time O(n);
Sopace O(1);