代码随想录算法训练营第十五天 | 二叉树part03
110 平衡二叉树 (优先掌握递归)
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
但leetcode中强调的深度和高度很明显是按照节点来计算的,如图:
关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。
因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中)
求深度适合用前序遍历,而求高度适合用后序遍历。
def isBalanced(self, root: Optional[TreeNode]) -> bool:
return self.get_hight(root) != -1
def get_hight(self, node):
if not node:
return 0
left = self.get_hight(node.left)
right = self.get_hight(node.right)
if left == -1 or right == -1 or abs(left - right) > 1:
return -1
return max(left, right) + 1
257 二叉树的所有路径 (优先掌握递归)
思路:首先要理解回溯的过程,1->2->5 这一条路径需要首先从root节点也就是1开始,向左向右遍历,首先是向左遍历进入第一次递归,然后到2,2向右遍历进入第二次递归,5没有子节点了,所以5就结束递归,开始弹出5,弹出2,然后两次递归均结束,开始进入第三次递归,这次是向右遍历了,所以直接把3加进来,3没有左右节点了,这样就直接pop(3)
def a(self,root):
path = []
result = []
if not root:
return
self.b(root,path,result)
return result
def b(self,node,path,result):
path.append(node)
if not node.left and not node.right:
result.append('->'.join(map(str,path)))
return
if node.left :
self.b(node.left,path,result)
path.pop()
if node.right :
self.b(node.right,path,result)
path.pop()
404 左叶子之和 (优先掌握递归)
if not root:
return 0
leftvalue = 0
if root.left and not root.left.left and not root.left.right :
leftvalue = root.left.val
return leftvalue + self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)
222 完全二叉树的节点个数(优先掌握递归)
if not root:
return 0
return 1 + self.countNodes(root.left) + self.countNodes(root.right)