求解Nary Tree 的Leaf 集合

52 阅读1分钟

求解Nary Tree 的Leaf 集合

这道题目考察的核心在于整体树的结构(构建能力) 而不是用到传统的递归.通过模拟遍历顺序, 当前节点, 第一个孩子的孩子, 如果没有孩子,就前往下一个兄弟, 如果没有兄弟,就再前往主线还没有访问过的兄弟

1.firstNode(root)--- 从根节点遍历开始 2. 判断当前节点是不是叶子节点, 加到总和中.

if(isLeaf(cur)){
       sum+=cur.val;
       }

叶子定义: children ==null|| children.isEmpty();

  1. 用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);