leetcode(二叉树) 翻转二叉树

                                                 翻转二叉树

 

1、题目:  

    翻转一棵二叉树。

    示例:

    输入:

        

    输出:

        

2、解题步骤:

    (1) 方案一:递归

        a、题解:

            翻转一棵空树结果还是一棵空树。对于一棵根为 r,左子树为 \mbox{left},右子树为\mbox{right}的树来说,它的翻转树是一棵根为 r,左子树为\mbox{left}的翻转树,右子树为\mbox{right}翻转树的树。

        b、代码:           

class TreeNode():
    def __init__(self, value, left=None, right=None):
        self.value, self.left, self.right = value, left, right


class BinTree():
    def __init__(self, root=None):
        self.root = root

    def preTraverse(self, root):
        """先(根)序遍历"""
        if root is None:
            return
        print(root.value)   # 递归处理根
        self.preTraverse(root.left)     # 递归处理左子树
        self.preTraverse(root.right)    # 递归处理右子树


class Solution:
    def invertTree(self, root: TreeNode) -> TreeNode:
        if root is None:
            return None

        # root.left, root.right = root.right, root.left
        # self.invertTree(root.right)
        # self.invertTree(root.left)
        root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)
        return root


if __name__ == "__main__":
    root = TreeNode("4",
                    TreeNode("2", TreeNode("1"), TreeNode("3")),
                    TreeNode("7", TreeNode("6"), TreeNode("9"))
                    )
    binTree = BinTree()
    print("翻转前:")
    binTree.preTraverse(root)
    solution = Solution()
    result = solution.invertTree(root)
    print("翻转后:")
    binTree.preTraverse(root)

        c、运行结果:      

翻转前:
4
2
1
3
7
6
9
翻转后:
4
7
9
6
2
3
1

    (2) 方案二:迭代

        a、题解:

            我们需要交换树种所有节点的左孩子和右孩子。因此可以创建一个队列来存储所有左孩子和右孩子还没有被交换过的节点。开始的时候,只有根节点在这个队列里面。只要这个队列不为空,就一直从队列中出队节点,然后互换这个节点的左右两个孩子节点,接着再把孩子节点入队到队列,对于其中的空节点不需要加入队列。最终队列一定会空,这时候所有节点的孩子节点都被互换过了,直接返回最初的根节点就可以了。

        b、代码:            

from collections import deque


class TreeNode():
    def __init__(self, value, left=None, right=None):
        self.value, self.left, self.right = value, left, right


class BinTree():
    def __init__(self, root=None):
        self.root = root

    def preTraverse(self, root):
        """先(根)序遍历"""
        if root is None:
            return
        print(root.value)   # 递归处理根
        self.preTraverse(root.left)     # 递归处理左子树
        self.preTraverse(root.right)    # 递归处理右子树


class Solution:
    def __init__(self):
        self.queue = deque()

    def empty(self):
        """
        判断队列是否为空队列
        """
        return len(self.queue) == 0

    def invertTree(self, root: TreeNode) -> TreeNode:
        if root is None:
            return None

        self.queue.append(root)

        while not self.empty():
            current = self.queue.popleft()    # 从队列左端移除元素,返回移除的元素
            current.left, current.right = current.right, current.left
            if current.left:
                self.queue.append(current.left)
            if current.right:
                self.queue.append(current.right)
        return root


if __name__ == "__main__":
    root = TreeNode("4",
                    TreeNode("2", TreeNode("1"), TreeNode("3")),
                    TreeNode("7", TreeNode("6"), TreeNode("9"))
                    )
    binTree = BinTree()
    print("翻转前:")
    binTree.preTraverse(root)
    solution = Solution()
    result = solution.invertTree(root)
    print("翻转后:")
    binTree.preTraverse(root)

        c、运行结果:          

翻转前:
4
2
1
3
7
6
9
翻转后:
4
7
9
6
2
3
1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值