代码随想录算法训练营第十五天 | 二叉树part03

75 阅读2分钟

代码随想录算法训练营第十五天 | 二叉树part03

110 平衡二叉树 (优先掌握递归)

image.png

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

但leetcode中强调的深度和高度很明显是按照节点来计算的,如图:

110.平衡二叉树2

关于根节点的深度究竟是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 二叉树的所有路径 (优先掌握递归)

image.png

思路:首先要理解回溯的过程,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 左叶子之和 (优先掌握递归)

image.png

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 完全二叉树的节点个数(优先掌握递归)

image.png

if not root:
    return 0
return 1 + self.countNodes(root.left) + self.countNodes(root.right)