合并二叉树

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

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

示例 1:

输入: 
	Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
输出: 
合并后的树:
	     3
	    / \
	   4   5
	  / \   \ 
	 5   4   7

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

代码:

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
 
class Solution {
public:
	TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
		mergeTree(t1, t2);
		return t1;
	}

	void mergeTree(TreeNode*& t1, TreeNode*& t2)
	{
		if (t1 == nullptr && t2 == nullptr)
			return;
		else if (t1 == nullptr && t2 != nullptr)
			t1 = t2;
		else if (t1 != nullptr && t2 != nullptr)
		{
			t1->val += t2->val;
			mergeTree(t1->left, t2->left);
			mergeTree(t1->right, t2->right);
		}
	}
};

 

### 合并二叉树的算法实现 在 Java 中实现二叉树合并可以通过递归方法完成。以下是详细的说明以及代码示例。 #### 算法描述 当两棵二叉树合并时,如果两个节点重叠,则将它们的值相加作为新节点的值;如果不重叠,则取非空节点作为新二叉树的一部分[^3]。此过程可以采用递归来处理每一对对应的节点。 #### 实现细节 定义一个 `TreeNode` 类表示二叉树中的节点,并编写一个函数用于合并两棵二叉树。该函数接收两个根节点作为参数,返回一个新的根节点代表合并后的二叉树。 #### 示例代码 以下是一个完整的 Java 实现: ```java // 定义二叉树节点类 class TreeNode { int val; TreeNode left, right; TreeNode(int x) { val = x; } } public class MergeBinaryTrees { // 主要逻辑:合并两棵二叉树 public static TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if (t1 == null) return t2; // 如果 t1 为空,直接返回 t2 if (t2 == null) return t1; // 如果 t2 为空,直接返回 t1 // 当前节点值为两者之和 t1.val += t2.val; // 递归合并左子树和右子树 t1.left = mergeTrees(t1.left, t2.left); t1.right = mergeTrees(t1.right, t2.right); return t1; // 返回修改后的 t1 树 } // 测试用例 public static void main(String[] args) { // 构建第一棵树 t1 TreeNode t1 = new TreeNode(1); t1.left = new TreeNode(3); t1.right = new TreeNode(2); t1.left.left = new TreeNode(5); // 构建第二棵树 t2 TreeNode t2 = new TreeNode(2); t2.left = new TreeNode(1); t2.right = new TreeNode(3); t2.left.right = new TreeNode(4); t2.right.right = new TreeNode(7); // 调用合并函数 TreeNode mergedTree = mergeTrees(t1, t2); // 打印结果(这里仅展示部分打印方式) System.out.println("Merged Tree Root Value: " + mergedTree.val); // 输出应为 3 } } ``` 上述代码通过递归的方式实现了二叉树合并操作。对于每一层的节点,分别判断其是否存在,进而决定如何更新当前节点及其子节点[^1]。 --- #### 复杂度分析 - **时间复杂度**: O(min(m, n)),其中 m 和 n 是两棵树的节点数。因为每次只访问对应位置上的节点一次。 - **空间复杂度**: O(min(h₁, h₂)),取决于递归栈的最大深度,h₁ 和 h₂ 分别是两棵树的高度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值