---
title: leetcode-543
date: 2020-03-25 19:13:52
tags:
categories: leetcode
---

### 543. 二叉树的直径


[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/)


<!--more-->



这题做出来了但是没有通过运行时间的测试，主要还是没想明白二叉树的直径到底是什么东西，用了个蠢办法。

```python
# Definition for a binary tree node.
class TreeNode:
  def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None

class Solution:
  def diameterOfBinaryTree(self, root: TreeNode) -> int:
    if not root:
      return 0
    last_node = -1
    routes = []
    start = root
    node_stack = [root]
    while (start.left or start.right or node_stack):
      if start != node_stack[-1]:
        node_stack.append(start)

      if last_node == start.right:
        node_stack = node_stack[:-1]
        if not node_stack:
          break
        last_node = start
        start = node_stack[-1]
        continue

      if start.left and last_node != start.left:
        start = start.left
        last_node = start
        continue

      if start.right:
        start = start.right
        last_node = start
        continue

      routes.append(node_stack)
      node_stack = node_stack[:-1]
      if not node_stack:
        break
      last_node = start
      start = node_stack[-1]

    max_l = 0
    for route in routes:
      for route_ in routes:
        intersection = 0
        if route != route_:
          intersection = len(set(route).intersection(set(route_)))
          if intersection:
            intersection -= 1
        max_l = max(max_l, len(set(route)| set(route_)) - intersection)
    return max_l - 1
```



L43 之前做的是以深度优先的方式遍历一遍树，得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径，算出最大长度。



其实以某个点为根节点的树的直径，就是某个节点的**左子树的深度和右子树的深度的和**，用递归来处理这个会比较容易理解



```python
class Solution(object):
    def diameterOfBinaryTree(self, root):
        self.ans = 1
        def depth(node):
            # 访问到空节点了，返回0
            if not node: return 0
            # 左儿子为根的子树的深度
            L = depth(node.left)
            # 右儿子为根的子树的深度
            R = depth(node.right)
            # 计算d_node即L+R+1 并更新ans
            self.ans = max(self.ans, L+R+1)
            # 返回该节点为根的子树的深度
            return max(L, R) + 1

        depth(root)
        return self.ans - 1

作者：LeetCode-Solution
链接：https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/
来源：力扣（LeetCode）
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
```


