返回介绍

solution / 1500-1599 / 1522.Diameter of N-Ary Tree / README

发布于 2024-06-17 01:03:18 字数 8617 浏览 0 评论 0 收藏 0

1522. N 叉树的直径

English Version

题目描述

给定一棵 N 叉树 的根节点 root ,计算这棵树的直径长度。

N 叉树的直径指的是树中任意两个节点间路径中 最长 路径的长度。这条路径可能经过根节点,也可能不经过根节点。

_(N 叉树的输入序列以层序遍历的形式给出,每组子节点用 null 分隔)_

 

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:3
解释:直径如图中红线所示。

示例 2:

输入:root = [1,null,2,null,3,4,null,5,null,6]
输出:4

示例 3:

输入: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出: 7

 

提示:

  • N 叉树的深度小于或等于 1000 。
  • 节点的总个数在 [0, 10^4] 间。

解法

方法一

"""
# Definition for a Node.
class Node:
  def __init__(self, val=None, children=None):
    self.val = val
    self.children = children if children is not None else []
"""


class Solution:
  def diameter(self, root: 'Node') -> int:
    """
    :type root: 'Node'
    :rtype: int
    """

    def dfs(root):
      if root is None:
        return 0
      nonlocal ans
      m1 = m2 = 0
      for child in root.children:
        t = dfs(child)
        if t > m1:
          m2, m1 = m1, t
        elif t > m2:
          m2 = t
      ans = max(ans, m1 + m2)
      return 1 + m1

    ans = 0
    dfs(root)
    return ans
/*
// Definition for a Node.
class Node {
  public int val;
  public List<Node> children;


  public Node() {
    children = new ArrayList<Node>();
  }

  public Node(int _val) {
    val = _val;
    children = new ArrayList<Node>();
  }

  public Node(int _val,ArrayList<Node> _children) {
    val = _val;
    children = _children;
  }
};
*/

class Solution {
  private int ans;

  public int diameter(Node root) {
    ans = 0;
    dfs(root);
    return ans;
  }

  private int dfs(Node root) {
    if (root == null) {
      return 0;
    }
    int m1 = 0, m2 = 0;
    for (Node child : root.children) {
      int t = dfs(child);
      if (t > m1) {
        m2 = m1;
        m1 = t;
      } else if (t > m2) {
        m2 = t;
      }
    }
    ans = Math.max(ans, m1 + m2);
    return 1 + m1;
  }
}
/*
// Definition for a Node.
class Node {
public:
  int val;
  vector<Node*> children;

  Node() {}

  Node(int _val) {
    val = _val;
  }

  Node(int _val, vector<Node*> _children) {
    val = _val;
    children = _children;
  }
};
*/

class Solution {
public:
  int ans;

  int diameter(Node* root) {
    ans = 0;
    dfs(root);
    return ans;
  }

  int dfs(Node* root) {
    if (!root) return 0;
    int m1 = 0, m2 = 0;
    for (Node* child : root->children) {
      int t = dfs(child);
      if (t > m1) {
        m2 = m1;
        m1 = t;
      } else if (t > m2)
        m2 = t;
    }
    ans = max(ans, m1 + m2);
    return 1 + m1;
  }
};
/**
 * Definition for a Node.
 * type Node struct {
 *   Val int
 *   Children []*Node
 * }
 */

func diameter(root *Node) int {
  ans := 0
  var dfs func(root *Node) int
  dfs = func(root *Node) int {
    if root == nil {
      return 0
    }
    m1, m2 := 0, 0
    for _, child := range root.Children {
      t := dfs(child)
      if t > m1 {
        m2, m1 = m1, t
      } else if t > m2 {
        m2 = t
      }
    }
    ans = max(ans, m1+m2)
    return 1 + m1
  }
  dfs(root)
  return ans
}

方法二

"""
# Definition for a Node.
class Node:
  def __init__(self, val=None, children=None):
    self.val = val
    self.children = children if children is not None else []
"""


class Solution:
  def diameter(self, root: 'Node') -> int:
    """
    :type root: 'Node'
    :rtype: int
    """

    def build(root):
      nonlocal d
      if root is None:
        return
      for child in root.children:
        d[root].add(child)
        d[child].add(root)
        build(child)

    def dfs(u, t):
      nonlocal ans, vis, d, next
      if u in vis:
        return
      vis.add(u)
      for v in d[u]:
        dfs(v, t + 1)
      if ans < t:
        ans = t
        next = u

    d = defaultdict(set)
    vis = set()
    build(root)
    ans = 0
    next = None
    dfs(root, 0)
    vis.clear()
    dfs(next, 0)
    return ans
/*
// Definition for a Node.
class Node {
  public int val;
  public List<Node> children;


  public Node() {
    children = new ArrayList<Node>();
  }

  public Node(int _val) {
    val = _val;
    children = new ArrayList<Node>();
  }

  public Node(int _val,ArrayList<Node> _children) {
    val = _val;
    children = _children;
  }
};
*/

class Solution {
  private Map<Node, Set<Node>> g;
  private Set<Node> vis;
  private Node next;
  private int ans;

  public int diameter(Node root) {
    g = new HashMap<>();
    build(root);
    vis = new HashSet<>();
    next = root;
    ans = 0;
    dfs(next, 0);
    vis.clear();
    dfs(next, 0);
    return ans;
  }

  private void dfs(Node u, int t) {
    if (vis.contains(u)) {
      return;
    }
    vis.add(u);
    if (t > ans) {
      ans = t;
      next = u;
    }
    if (g.containsKey(u)) {
      for (Node v : g.get(u)) {
        dfs(v, t + 1);
      }
    }
  }

  private void build(Node root) {
    if (root == null) {
      return;
    }
    for (Node child : root.children) {
      g.computeIfAbsent(root, k -> new HashSet<>()).add(child);
      g.computeIfAbsent(child, k -> new HashSet<>()).add(root);
      build(child);
    }
  }
}
/*
// Definition for a Node.
class Node {
public:
  int val;
  vector<Node*> children;

  Node() {}

  Node(int _val) {
    val = _val;
  }

  Node(int _val, vector<Node*> _children) {
    val = _val;
    children = _children;
  }
};
*/

class Solution {
public:
  unordered_map<Node*, unordered_set<Node*>> g;
  unordered_set<Node*> vis;
  Node* next;
  int ans;

  int diameter(Node* root) {
    build(root);
    next = root;
    ans = 0;
    dfs(next, 0);
    vis.clear();
    dfs(next, 0);
    return ans;
  }

  void dfs(Node* u, int t) {
    if (vis.count(u)) return;
    vis.insert(u);
    if (ans < t) {
      ans = t;
      next = u;
    }
    if (g.count(u))
      for (Node* v : g[u])
        dfs(v, t + 1);
  }

  void build(Node* root) {
    if (!root) return;
    for (Node* child : root->children) {
      g[root].insert(child);
      g[child].insert(root);
      build(child);
    }
  }
};
/**
 * Definition for a Node.
 * type Node struct {
 *   Val int
 *   Children []*Node
 * }
 */

func diameter(root *Node) int {
  g := make(map[*Node][]*Node)
  vis := make(map[*Node]bool)
  next := root
  ans := 0
  var build func(root *Node)
  build = func(root *Node) {
    if root == nil {
      return
    }
    for _, child := range root.Children {
      g[root] = append(g[root], child)
      g[child] = append(g[child], root)
      build(child)
    }
  }
  build(root)
  var dfs func(u *Node, t int)
  dfs = func(u *Node, t int) {
    if vis[u] {
      return
    }
    vis[u] = true
    if t > ans {
      ans = t
      next = u
    }
    if vs, ok := g[u]; ok {
      for _, v := range vs {
        dfs(v, t+1)
      }
    }
  }
  dfs(next, 0)
  vis = make(map[*Node]bool)
  dfs(next, 0)
  return ans
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文