代码随想录算法训练营第十五天 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数
110.平衡二叉树
给定一个二叉树,判断它是否是 平衡二叉树
解题
思路:判断左右孩子的高度差是否超过1,用-1表示是否是平衡二叉树。
终止条件:碰到空节点,返回高度0。
报错:当左/右子树不平衡是,直接返回-1,不用继续计算。
因为如果一个子树不平衡(即高度返回 -1),仍然继续计算另一个子树的高度,并试图计算其高度差,可能会出现比如0和-1,那可能又对了。
点击查看代码
class Solution:
def isBalanced(self, root: Optional[TreeNode]) -> bool:
if self.getheight(root)==-1:
return False
else:
return True
def getheight(self,node:Optional[TreeNode]):
if node is None:
return 0
leftheight=self.getheight(node.left)
if leftheight==-1:
return -1
rightheigth=self.getheight(node.right)
if rightheigth==-1:
return -1
if abs(leftheight-rightheigth)>1:
return -1
else:
return 1+max(leftheight,rightheigth)
257.二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
解题
终止条件:碰到叶子节点,判断叶子节点指当前值不为空且左右孩子为空。
关键:一个递归就要有一个回溯!
语法:map(str,path[:])列表每一项转化为字符串
报错:递归要保证节点不为空,不然中处理时候node.val会报错。
点击查看代码
class Solution:
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
result=[]
self.path(root,[],result)
return result
def path(self,node,path,result):
path.append(node.val)
if node and not node.left and not node.right:
result.append('->'.join(map(str,path[:])))
if node.left:
self.path(node.left,path,result)
path.pop()
if node.right:
self.path(node.right,path,result)
path.pop()
404.左叶子之和
给定二叉树的根节点 root ,返回所有左叶子之和。
解题
平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。
左叶子:父节点A的左孩子存在,左孩子的左右孩子不存在,A的左孩子为左叶子
点击查看代码
class Solution:
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
if root.left:
if not root.left.left and not root.left.right:
leftsum = root.left.val
else:
leftsum = self.sumOfLeftLeaves(root.left)
else:
leftsum=0
rightsum=self.sumOfLeftLeaves(root.right)
sum=leftsum+rightsum
return sum
222.完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
解题
跟求高度一样,就按普通二叉树求,没看完全二叉树的方法
点击查看代码
class Solution:
def countNodes(self, root: Optional[TreeNode]) -> int:
if root is None:
return 0
leftnum=self.countNodes(root.left)
rightnum=self.countNodes(root.right)
return leftnum+rightnum+1