226. 翻转二叉树
题目链接
leetcode.cn/problems/in…
文章链接
programmercarl.com/0226.%E7%BF…
视频链接
www.bilibili.com/video/BV1sP…
看到题目的第一想法
不知道怎么去实现,索性去看卡哥的视频了。
看完代码随想录之后的想法
看了才知道原来用递归的方式就可以实现,利用前中后序遍历均可实现,于是根据卡哥的思路写了一下,下面附上我的go语言代码: 前序遍历代码:
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
root.Left, root.Right = root.Right, root.Left
invertTree(root.Left)
invertTree(root.Right)
return root
}
后序遍历代码:
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
invertTree(root.Left)
invertTree(root.Right)
root.Left, root.Right = root.Right, root.Left
return root
}
中序遍历代码(尤其注意):
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
invertTree(root.Left)
root.Left, root.Right = root.Right, root.Left
invertTree(root.Left)
return root
}
这里中序遍历尤其要注意,可以看到当交换的代码放到左右子树的中间时,invertTree(root.Left)执行了两次,因为交换过后,执行了翻转,右子树变成了左子树,所以invertTree(root.Left)执行了两次。所以同理可得,invertTree(root.Right)执行两次也是可以的,代码即为:
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
invertTree(root.Right)
root.Left, root.Right = root.Right, root.Left
invertTree(root.Right)
return root
}
实现过程中遇到的困难
困难倒是没有,因为卡哥已经把题目中的困难点都讲出来了。
今日收获
今日收获就是大部分二叉树的题目都可以用递归来写。
101. 对称二叉树
题目链接
leetcode.cn/problems/sy…
文章链接
programmercarl.com/0101.%E5%AF…
视频链接
www.bilibili.com/video/BV1ue…
看到题目的第一想法
第一想法就是思考对称二叉树和翻转二叉树有什么区别,最开始的想法就是翻转二叉树,然后比较两个二叉树是否相同,相同返回true,不同返回false,不就行了吗?但是看了某网友的回答,才知道自己的想法是错的,那位网友说“你每次交换都是以一个根节点交换左子树右子树,然后以这个节点为对称判断是不是对称。但比如说这个树示例1,有三层,你按第二层左边2交换左右子树之后,你是拿交换了左右的2结点和原来的2结点判断是否一致的,但是按题目要求你应该和右边的2结点subtree判断是否一致,才能说这棵树是对称的,但是你的方法里是做不到的。”所以按照卡哥的思路,把各种情况罗列出来,下面附上我的go语言代码:
func compareRoot(left, right *TreeNode) bool {
if left == nil && right == nil {
return true
} else if left == nil || right == nil {
return false
} else if left.Val != right.Val {
return false
}
return compareRoot(left.Left, right.Right) && compareRoot(left.Right, right.Left)
}
func isSymmetric(root *TreeNode) bool {
return compareRoot(root.Left, root.Right)
}
首先,如果左右结点均为空,返回true,如果其中一个子树为空,另一个不为空,则返回false,或者左右结点的值不同,也返回true,返回递归的函数,函数为比较左子树的左结点和右子树的右结点并且左子树的右结点和左子树的右结点,这样得出的结果才正确。
实现过程中遇到的困难
返回的函数写得有点吃力,看了答案才写出来。
今日收获
这道题的收获就是明白了把所有情况都罗列出来,再进行判断。