美文网首页
tag10:树 反转二叉树和合并二叉树

tag10:树 反转二叉树和合并二叉树

作者: 是黄小胖呀 | 来源:发表于2021-01-06 23:29 被阅读0次

leetcode226. 翻转二叉树

翻转一棵二叉树。

示例:

输入:

    4

  /  \

  2    7

/ \  / \

1  3 6  9

输出:

    4

  /  \

  7    2

/ \  / \

9  6 3  1

(1)递归写法:

关键点是对换当前根节点的左右节点和递归当前根节点的左右节点:

class Solution:

    def invertTree(self, root: TreeNode) -> TreeNode:

        if not root:

            return 

        tmp=root.left

        root.left=root.right

        root.right=tmp

        self.invertTree(root.left) 

        self.invertTree(root.right)

        return root

(2)迭代写法

关键点:对换节点和不断引入右左节点,以及每次遍历一层,宽度优先遍历

class Solution:

    def invertTree(self, root: TreeNode) -> TreeNode:

        if not root:

            return 

        d1=[root]

        while d1:

            for i in range(len(d1)):

                t=d1.pop(0)

                tmp=t.right

                t.right=t.left

                t.left=tmp

                if t.left:

                    d1.append(t.left)

                if t.right:

                    d1.append(t.right)

        return root

leetcode617. 合并二叉树

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

输入:

Tree 1                    Tree 2                 

          1                        2                           

        / \                      / \                           

        3  2                    1  3                       

      /                          \  \                     

      5                            4  7                 

输出:

合并后的树:

    3

    / \

  4  5

  / \  \

5  4  7

注意: 合并必须从两个树的根节点开始。

(1)递归写法

关键点是比较节点和递归左右节点

代码如下:

class Solution:

    def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:

        t=TreeNode()     

        if not t1 and not t2:

            return       

        if not t1 or not t2:

            if  t1:

                t=t1

            if  t2:

                t=t2      

        if  t1 and t2:

            t.val=t1.val+t2.val

            t.left=self.mergeTrees(t1.left,t2.left)

            t.right=self.mergeTrees(t1.right,t2.right)      

        return t

(2)迭代写法

关键点:

1)一个队列的元素中包含左右树,先进行值加操作,确定都不为空添加,然后为空时如下:

2)判断左树为空,将右树值赋给左树

class Solution:

    def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:

        if not (t1 and t2):

            if not t1:

                return t2

            if not t2:

                return t1

        queue = [(t1,t2)]

        while queue:

            r1,r2 = queue.pop(0)

            r1.val += r2.val

            # 如果r1和r2的左子树都不为空,就放到队列中

            # 如果r1的左子树为空,就把r2的左子树挂到r1的左子树上

            if r1.left and r2.left:

                queue.append((r1.left,r2.left))

            elif not r1.left:

                r1.left = r2.left

            # 对于右子树也是一样的

            if r1.right and r2.right:

               queue.append((r1.right,r2.right))

            elif not r1.right:

                r1.right = r2.right

        return t1

相关文章

  • 02-13:leetcode重刷2之链表反转

    1、链表反转 2、反转二叉树 3、合并二叉树 4、对称二叉树 1、反转链表 classSolution: defr...

  • LeetCode0305

    461. 汉明距离 617. 合并二叉树 226. 翻转二叉树 104. 二叉树的最大深度 206. 反转链表 2...

  • 2020-10-28

    快排 链表反转 链表反转 二叉树非递归实现 按层排序 二叉树深度 合并有序数组 二分查找 有序数组 查找 楼梯问题

  • tag10:树 反转二叉树和合并二叉树

    leetcode226. 翻转二叉树[https://leetcode-cn.com/problems/inver...

  • Golang反转二叉树

    反转二叉树

  • 精选-LC

    10. 正则表达式匹配 617. 合并二叉树 104. 二叉树的最大深度 557. 反转字符串中的单词 III 5...

  • 二叉树

    title: 二叉树date: 2016-08-16 14:47:21tags: 算法 二叉树 二叉树的反转

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 617. 合并二叉树

    617. 合并二叉树

  • Swift-反转二叉树

    题目: 反转二叉树其实就是二叉树的镜像.4/ 2 7/ \ / 1 3 6 9to4/ ...

网友评论

      本文标题:tag10:树 反转二叉树和合并二叉树

      本文链接:https://www.haomeiwen.com/subject/hbranktx.html