zoukankan      html  css  js  c++  java
  • 0617.合并二叉树 Marathon

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

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

    示例 1:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-two-binary-trees
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    参考:

    python

    # 0617.合并二叉树
    
    # 递归-DFS
    # 递归-前序
    class Solution1:
        def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:
            # 递归终止条件
            if not root1:
                return root2
            if not root2:
                return root1
            # 修改root1结构与值-N
            root1.val += root2.val
            # L
            root1.left = self.mergeTrees(root1.left, root2.left)
            # R
            root1.right = self.mergeTrees(root1.right, root2.right)
            return root1
    
    # 递归-中序
    class Solution2:
        def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:
            # 递归终止条件
            if not root1:
                return root2
            if not root2:
                return root1
    
            # L
            root1.left = self.mergeTrees(root1.left, root2.left)
            # 修改root1结构与值-N
            root1.val += root2.val
            # R
            root1.right = self.mergeTrees(root1.right, root2.right)
            return root1
    
    # 递归-后序
    class Solution3:
        def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:
            # 递归终止条件
            if not root1:
                return root2
            if not root2:
                return root1
    
            # L
            root1.left = self.mergeTrees(root1.left, root2.left)
            # R
            root1.right = self.mergeTrees(root1.right, root2.right)
            # 修改root1结构与值-N
            root1.val += root2.val
            return root1
    
    # 迭代-BFS
    # 迭代-层序遍历
    class Solution4:
        def mergerTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:
            if not root1:
                return root2
            if not root2:
                return root1
    
            from collections import deque
            queue = deque()
            queue.append(root1)
            queue.append(root2)
    
            while queue:
                node1 = queue.popleft()
                node2 = queue.popleft()
                # 合并节点值
                node1.val += node2.val
                # 左节点非空加入队列
                if node1.left and node2.left:
                    queue.append(node1.left)
                    queue.append(node2.left)
                # 右节点非空介入队列
                if node1.right and node2.right:
                    queue.append(node1.right)
                    queue.append(node2.right)
                # root1左节点空,root2左节点非空
                if not node1.left and node2.left:
                    node1.left = node2.left
                # root1右节点空,root2右节点非空
                if not node1.right and node2.right:
                    node1.right = node2.right
            return root1
    
    

    golang

    package binaryTree
    
    // 递归-DFS
    // 递归-前序
    func mergeTrees(root1, root2 *TreeNode) *TreeNode {
    	if root1 == nil {
    		return root2
    	}
    	if root2 == nil {
    		return root1
    	}
    
    	root1.Val += root2.Val
    	root1.Left = mergeTrees(root1.Left, root2.Left)
    	root1.Right = mergeTrees(root1.Right, root2.Right)
    
    	return root1
    }
    
    // 递归-中序
    func mergeTrees1(root1, root2 *TreeNode) *TreeNode {
    	if root1 == nil {
    		return root2
    	}
    	if root2 == nil {
    		return root1
    	}
    
    	root1.Left = mergeTrees1(root1.Left, root2.Left)
    	root1.Val += root2.Val
    	root1.Right = mergeTrees1(root1.Right, root2.Right)
    
    	return root1
    }
    
    // 递归-后序
    func mergeTrees2(root1, root2 *TreeNode) *TreeNode {
    	if root1 == nil {
    		return root2
    	}
    	if root2 == nil {
    		return root1
    	}
    
    	root1.Left = mergeTrees1(root1.Left, root2.Left)
    	root1.Right = mergeTrees1(root1.Right, root2.Right)
    	root1.Val += root2.Val
    
    	return root1
    }
    
    // 迭代-BFS
    func mergeTrees3(root1, root2 *TreeNode) *TreeNode {
    	if root1 == nil {
    		return root2
    	}
    	if root2 == nil {
    		return root1
    	}
    
    	queue := make([]*TreeNode, 0)
    	queue = append(queue, root1)
    	queue = append(queue, root2)
    
    	for size:=len(queue);size>0;size=len(queue) {
    		node1 := queue[0]
    		queue = queue[1:]
    		node2 := queue[0]
    		queue = queue[1:]
    		node1.Val += node2.Val
    
    		if node1.Left != nil && node2.Left != nil {
    			queue = append(queue, node1.Left)
    			queue = append(queue, node2.Left)
    		}
    		if node1.Right != nil && node2.Right != nil {
    			queue = append(queue, node1.Right)
    			queue = append(queue, node2.Right)
    		}
    		if node1.Left == nil && node2.Left != nil {
    			node1.Left = node2.Left
    		}
    		if node1.Right == nil && node2.Right != nil {
    			node1.Right = node2.Right
    		}
    	}
    	return root1
    }
    
    
  • 相关阅读:
    详细的描述一个测试活动完整的过程
    黑盒测试的测试用例常见设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。
    测试计划工作的目的是什么?测试计划文档的内容应该包括什么?其中哪些是最重要的?
    redo log 有什么作用?
    Spring的简介和优点?
    java的语法基础(二)
    相对于Statement,PreparedStatement的优点是什么?
    MyBatis 的好处是什么?
    python中字符串的编码和解码
    相对于Statement,PreparedStatement的优点是什么?
  • 原文地址:https://www.cnblogs.com/davis12/p/15565616.html
Copyright © 2011-2022 走看看