镜像二叉树 + Invert Binary Tree + 对称二叉树

一:剑指offer:二叉树的镜像

1.1 题意

操作给定的二叉树,将其变换为源二叉树的镜像。
在这里插入图片描述

1.2 思路

这是道简单题,只需要把左右子树的值交换就行,先序遍历,自顶向下进行交换,也就是最左边节点与最右边节点交换值,其他也一样。

改变了二叉树的形态了,变成对称的了!

1.3 python实现

class Solution:
    # 返回镜像树的根节点
    def Mirror(self, root): # 递归来做, 先序遍历
        # write code here
        if not root: return
        root.left, root.right = root.right, root.left
        self.Mirror(root.left)
        self.Mirror(root.right)

二:leetcode 226. Invert Binary Tree

2.1 题意

给定一棵二叉树,将其翻转成对称的二叉树,如下图所示。
在这里插入图片描述

2.2 思路

  • 思路一:AC
    先序遍历,自顶向下来做,对于每一个子树root,都把左右儿子给交换过来,不是交换值,而是交换了子树啊!
class Solution(object):
    def invertTree(self, root):
        if not root: return
        root.left, root.right = root.right, root.left  # 交换了子树
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root
  • 思路二:AC
    需要改变树的形态,比如左子树有一个左儿子,而右子树没有儿子,
    此时也要把左子树的左儿子转移到右子树的右儿子上面,这种是麻烦的,如同下图所示:
    在这里插入图片描述
    如上图所示:
    当左右节点都不存在时:return
    当左右节点都存在时:只需要交换左右节点的值就行
    当只存在一个时: 把存在的那一个子树移植到另外一个不存在的节点那,然后对这个子树继续进行convert()

  • 思路三:和思路2相似,只是更加简单的递归来实现。

2.3 python实现

思路二:

class Solution(object):
    def invertTree(self, root):
        
        if not root: return None
        if not root.left and not root.right: return root
        
        def invert(parent1, root1, parent2, root2): # 改变树的形态,先序遍历
            if not root1 and not root2: return
            elif root1 and not root2:
                if parent1.left and parent1.left.val == root1.val: # 左儿子
                    parent2.right = root1  # 把左儿子移到右儿子
                    parent1.left = None
                    invert(root1, root1.left, root1, root1.right) # 子树进行转化
                else: # 右儿子
                    parent2.left = root1  # 把右儿子移到左儿子
                    parent1.right = None
                    invert(root1, root1.left, root1, root1.right) # 子树进行转化
            elif not root1 and root2:
                if parent2.left and parent2.left.val == root2.val: # 左儿子
                    parent1.right = root2  # 把左儿子移到右儿子
                    parent2.left = None
                    invert(root2, root2.left, root2, root2.right) # 子树进行转化
                else: # 右儿子
                    parent1.left = root2  # 把右儿子移到左儿子
                    parent2.right = None
                    invert(root2, root2.left, root2, root2.right) # 子树进行转化
            else:
                root1.val, root2.val = root2.val, root1.val  # 交换值
                invert(root1, root1.left, root2, root2.right)
                invert(root1, root1.right, root2, root2.left)  
    
        
        invert(root, root.left, root, root.right)
        
        return root

思路三:

class Solution(object):
    def invertTree(self, root): # 后序遍历,自底向上来改变树的形态
        if not root: return None
        right = self.invertTree(root.right)
        left = self.invertTree(root.left)
        root.left, root.right = right, left  # 交换左右子树
        return root

三:剑指offer: 对称的二叉树

3.1 题意

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

3.2 思路

和上一题有点类似啊,一个是变成对称,这个更简单,只需要判断是否对称就行了

3.3 python实现

class Solution:
    def isSymmetrical(self, root):
        # write code here
        if not root: return True
        if not root.left and not root.right: return True
        self.res = True
         
        def postOrder(root1, root2):
            if not root1 and not root2: return
            if root1 and not root2:
                self.res = False
                return  # 只存在一个节点
            if not root1 and root2:
                self.res = False
                return
            postOrder(root1.left, root2.right) # 左子树向左走到最左边,右子树向右走到最右边
            postOrder(root1.right, root2.left)
            if root1.val != root2.val:
                self.res = False
                return
             
             
        postOrder(root.left, root.right)
        return self.res
发布了40 篇原创文章 · 获赞 10 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章