--- title: leetcode-543 date: 2020-03-25 19:13:52 tags: - leetcode categories: leetcode --- ### 543. 二叉树的直径 [题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/) 这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。 ```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) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ```