C++合并二叉树的递归思路与代码实现

清欢
清欢
发布时间:2026-10-16| 5人浏览过
原创

本文介绍在C++中合并两个二叉树的算法实现。合并规则为:若两节点重叠,则值相加;否则非空节点直接作为新树节点。文章通过递归方式解析思路,并提供修改原树结构和不破坏原结构的两种代码示例。

问题背景与目标

给定两个二叉树,将其中一个覆盖到另一个上时,部分节点会重叠。合并的规则如下:

  • 如果两个节点重叠,将它们对应的值相加,作为新二叉树该节点的值。
  • 如果其中任何一个节点不为 NULL,则该非空节点直接作为新二叉树的对应节点(即不需要创建新节点,直接复用或返回即可)。

核心思路解析

解决此问题最直观的方法是采用深度优先搜索(DFS)中的前序遍历递归思想。我们需要确定递归函数的三个要素:

第一步:确定递归函数的参数和返回值

由于需要合入两棵二叉树,函数至少需要传入两个二叉树的根节点 t1 和 t2。返回值则是合并后的新二叉树的根节点,类型同样为 TreeNode*。

TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2)

第二步:确定终止条件

因为涉及两棵树的同步遍历,当遇到空节点时需特殊处理:

  • 如果 t1 == NULL,说明t1在该位置已遍历结束,此时合并结果应直接返回 t2(即使 t2 也为 NULL,返回 NULL 也是正确的)。
  • 反之,如果 t2 == NULL,则直接返回 t1。

这段逻辑天然处理了两个树长度不一致的情况:

if (t1 == NULL) return t2;
if (t2 == NULL) return t1;

第三步:确定单层递归逻辑

在终止条件之外,说明 t1 和 t2 均不为空。此时有两种常见的处理策略:

  1. 修改原有树结构(原地合并):直接利用 t1 作为结果的根节点,将其值累加 t2 的值,然后递归处理左右子树。
  2. 新建一棵树:不改变原树,每次递归创建新节点来存储结果。

实战代码示例

策略一:修改原有树结构(推荐空间效率较高)

这种方法直接复用 t1 的节点对象,仅修改其值和指针指向,无需额外开辟大量内存创建新节点。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        // 终止条件:如果任一节点为空,返回另一个节点
        if(root1==nullptr) return root2;
        if(root2==nullptr) return root1;

        // 累加当前节点值
        root1->val+=root2->val;
        
        // 递归合并左子树和右子树,并将结果赋值给root1的子节点
        root1->left=mergeTrees(root1->left, root2->left);
        root1->right=mergeTrees(root1->right, root2->right);
        
        return root1;
    }
};

策略二:新建一棵树(不破坏原结构)

如果业务要求保留原有的两棵二叉树不变,则需要创建一个新的节点 node。在创建节点时,需判断原节点是否为空,若为空则视为值0参与计算。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        // 如果两个都为空,直接返回空
        if(!t1 && !t2)
            return NULL;
            
        // 创建新节点,初始值为0
        TreeNode* node=new TreeNode(0);
        
        // 计算新节点的值:处理null情况,若为空则取0
        node->val=(t1 ? t1->val:0)+(t2 ? t2->val:0);
        
        // 递归构建左右子树,注意递归入口也要处理空指针
        node->left=mergeTrees((t1 ? t1->left : NULL),(t2 ? t2->left :NULL));
        node->right=mergeTrees((t1 ? t1->right : NULL),(t2 ? t2->right : NULL));
        
        return node;
    }
};

完成判断与验证

调用上述函数并传入两棵树的根节点后,函数将返回一个新二叉树的根节点(策略二)或修改后的树根(策略一)。可以通过前序遍历打印该树的节点值序列,并与预期结果对比,确认重叠节点是否正确求和,非空节点是否正确挂载。

以上就是C++合并二叉树的详细内容,更多关于C++二叉树合并算法的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。