​LeetCode刷题实战156:上下翻转二叉树

程序IT圈

共 2444字,需浏览 5分钟

 ·

2021-01-16 13:56

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 上下翻转二叉树(这题Leetcode需要会员才能看),我们先来看题面:
https://leetcode-cn.com/problems/binary-tree-upside-down

Given a binary tree in which all right nodes are either leaf nodes with sibling nodes (left nodes with the same parent nodes) or empty, flip the binary tree up and down and turn it into a tree, and the original right nodes will be converted into left leaf nodes. Returns the new root.   

题意

给定一个二叉树,其中所有的右节点要么是具有兄弟节点(拥有相同父节点的左节点)的叶节点,要么为空,将此二叉树上下翻转并将它变成一棵树, 原来的右节点将转换成左叶节点。返回新的根。

样例

解题

https://blog.csdn.net/qq_32424059/article/details/93920527


思路1:递归

对于root而言,root应该成为root.left的右孩子,root.right应该成为root.left的左孩子。最后返回的是root.left处理之后的返回值。

class Solution(object):
    def upsideDownBinaryTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """

        #每一个节点变成其左孩子的右节点
        if not root or (not root.left and not root.right):
            return root
 
        newroot = self.upsideDownBinaryTree(root.left)
        # self.upsideDownBinaryTree(root.right) 右孩子不用处理 因为要么不存在要么是叶节点
        
        root.left.left = root.right
        root.left.right = root
        root.left = None
        root.right = None
 
        return newroot


思路2:迭代
对于任意node,假设我们已经知道了它的父节点和兄弟节点,
先把node.left, node.right备份好,
然后node.left 就是兄弟节点, node.right就是父节点。
下一次循环处理备份好的原来的node.left。

class Solution(object):
    def upsideDownBinaryTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """

        #每一个节点变成其左孩子的右节点
        if not root or (not root.left and not root.right):
            return root
 
        parent, sibling = None, None
        while root:
            tmp = root.left
            root.left = sibling
            
            sibling = root.right
            root.right = parent
            
            parent = root
            root = tmp
            
        return parent

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。

上期推文:

LeetCode1-140题汇总,希望对你有点帮助!
LeetCode刷题实战141:环形链表
LeetCode刷题实战142:环形链表 II
LeetCode刷题实战143:重排链表
LeetCode刷题实战144:二叉树的前序遍历
LeetCode刷题实战145:二叉树的后序遍历
LeetCode刷题实战146:LRU 缓存机制
LeetCode刷题实战147:对链表进行插入排序
LeetCode刷题实战148:排序链表
LeetCode刷题实战149:直线上最多的点数
LeetCode刷题实战150:逆波兰表达式求值
LeetCode刷题实战151:翻转字符串里的单词
LeetCode刷题实战152:乘积最大子数组
LeetCode刷题实战153:寻找旋转排序数组中的最小值
LeetCode刷题实战154:寻找旋转排序数组中的最小值 II
LeetCode刷题实战155:最小栈


浏览 9
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报