Sum of leaf node for an N-ary tree

Give an n-ary tree, find the sum of all leaf nodes
首先这题要先确认treeNode的定义

class TreeNode {
  int val;
  List children;
}

这题就很简单就用DFS recursion来做一下就好了。

解答如下。

class Solution {
  public int leafSum(TreeNode root) {
    //base case:    
    if (root == null) return 0;
    if (root.children == null || root.children.size() == 0) return root.val;
    
    int sum = root.val;
    for (TreeNode child : children) {
       sum += leafSum(child);
    }
    return sum;
  }
}

也可以用BFS做,代码就有点长。

public int leafSumBFS(TreeNode root) {
   int sum = 0;
   if (root == null) return 0;
   Queue queue = new LinkedList<>();
   queue.offer(root);
    while (!queue.isEmpty()) {
       TreeNode node = queue.poll();
       if (node.children == null || node.children.size() == 0) sum += node.val;
       else {
          for (TreeNode child : node.children) {
            queue.offer(child);
          }
       }
   }
   return sum;
}

Follow up: 现在都是常规题,现在我们要求O(1) space的解法。因为现在的是O(h)的space, h 是height.
给的条件是可以改TreeNode的定义
我们就加了一个 parent的指针。
然后在使用的时候我们加一个prev变量, 来记录我们从哪里来的。

class TreeNode {
  int val;
  TreeNode left, right, parent;
}
class Solution {
  public int leafSum(TreeNode root) {
    int sum = 0;
    TreeNode node = root, prev = null; //用prev变量来分辨从哪里来的 
    while (node != null) {
        if (node.left == null && node.right == null) { // leaf node
          sum += node.val;
          prev = node;
          node = node.parent;//return to parent
        } else {  //non leaf node
           if (prev != null && prev.parent == node) { //从下面来的 
              if (node.right != null && prev != node.right) { //还可以遍历右孩子
                node = node.right;
                prev = node;
              }  else { //没得遍历了,返回
                prev = node;
                node = node.parent;
              }
          }  else {  //从上面来的
             prev = node;
             node = node.left;
          }
        }
    }
  return sum;
  }
}

Nary tree

class TreeNode {
  int val;
  TreeNode parent;
  List children;
}
class Solution {
  public int leafSum(TreeNode root) {
    int sum = 0;
    TreeNode node = root, prev = null; //用prev变量来分辨从哪里来的 
    while (node != null) {
        if (node.children == null || node.children.size() == 0) { // leaf node
          sum += node.val;
          prev = node;
          node = node.parent;//return to parent
        } else {  //non leaf node
           if (prev != null && prev.parent == node) { //从下面来的 
              if (node.children != null && 
                    prev != node.children.get(node.children.size() - 1)) { //还可以遍历右孩子
                int i = 0;
                for (; i < node.children.size(); i++) {
                  if (prev == node.children.get(i)) break;
                }
                prev = node;
                node = node.children.get(i + 1);
              }  else { //没得遍历了,返回
                prev = node;
                node = node.parent;
              }
          }  else {  //从上面来的
             prev = node;
             node = node.children.get(0);
          }
        }
    }
  return sum;
  }
}

你可能感兴趣的:(Sum of leaf node for an N-ary tree)