翻转二叉树:
讲解:代码随想录
思路:
递归法:通过递归交换结点的左右字结点,中止条件:结点为空 ,采用的前序遍历,最好采用前序和后序遍历,因为中序遍历会比较绕。
代码:
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return root#这个return root是中止中间inverttree函数的操作
root.left,root.right=root.right,root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root#此处是中止整个invertTree的操作
遇到的问题:
1.对于每个return 的作用
对称二叉树:
思路:
递归法:使用递归判断数的内侧和外侧是否相同,比较函数传入根节点的两个子树对称的结点,进行判断,直到到达出现空结点时,意味着到达了两端树其中一端或者两端的尽头,此时开始回溯
代码:
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
return self.compare(root.left,root.right)
def compare(self,left,right):
if left == None and right ==None :
return True
elif left == None and right!=None:
return False
elif left !=None and right == None:
return False
elif left.val !=right.val:#此时比较值,是在结点都不为空的基础上存在的
return False
outside = self.compare(left.left,right.right)
inside = self.compare(left.right,right.left)
res = outside and inside
return res
遇到的问题:
1.对于是否对称的判断条件:一边为空一边不为空,那么不对称,两边为空为对称,此时到达树的结尾开始递归中的归,还有一种结点都存在,且值相等,此时还未到达树的结尾,继续向内递进
二叉树的最大深度:
思路:
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
求二叉树的深度一般使用前序遍历,求二叉树高度一般用后序遍历,但此题二叉树最大深度等于二叉树最大高度,所以优先用简单的后序遍历
使用递归法
代码:
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
#采用后序遍历,因为最大深度等于最大高度
leftlight = self.maxDepth(root.left)
rightlight = self.maxDepth(root.right)
light = max(leftlight,rightlight)+1
return light
遇到的问题:
1.对于叶子结点的理解
2.对于前序遍历的理解(先放过,等回溯再看)
二叉树的最小深度:
思路:
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
求二叉树的深度一般使用前序遍历,求二叉树高度一般用后序遍历,但此题二叉树最小深度等于二叉树最小高度,所以优先用简单的后序遍历
使用递归法
代码:
递归法
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
leftlight = self.minDepth(root.left)
rightlight = self.minDepth(root.right)
#问题一
if root.left and not root.right :#
return leftlight+1
if root.left ==None and root.right !=None :
return rightlight+1
light = min(leftlight,rightlight)+1
return light
遇到的问题:
1.问题一(对应代码中):对于递归中归的操作时,因为求的是最小深度,是根结点到叶子结点的距离,所以在最底部要判断是否为叶子结点,在中途要注意区别缺一个子结点的情况,总的来说就是当只有一个子节点时,如何判断结点对于最小深度的贡献