二叉树&完全二叉树&合并二叉树

二叉树

二叉树是一种树形数据结构,它由节点和边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的特点是每个节点最多有两个子节点,且左子节点的值小于父节点的值,右子节点的值大于父节点的值。

二叉树的应用非常广泛,例如在计算机科学中,二叉树被用于搜索算法、排序算法、编译器、数据库等领域。

下面是一个二叉树的案例:

    5
   / \
  3   7
 / \   \
2   4   8

这是一个包含7个节点的二叉树,根节点的值为5,左子节点的值为3,右子节点的值为7。左子节点有两个子节点,值分别为2和4,右子节点有一个子节点,值为8。这个二叉树满足二叉搜索树的条件,即左子节点的值小于父节点的值,右子节点的值大于父节点的值。

完全二叉树

完全二叉树是一种特殊的二叉树,它满足以下两个条件:

  1. 所有的叶子节点都在最后一层或倒数第二层。
  2. 最后一层的叶子节点都靠左排列,而且除了最后一层,其他层的节点个数都是满的。

完全二叉树的性质:

  1. 对于任意一个完全二叉树,如果其节点数为n,则其深度为log2(n+1)。
  2. 对于任意一个完全二叉树的第i个节点,如果i>1,则其父节点为i/2,左子节点为2i,右子节点为2i+1。

下面是一个完全二叉树的例子:

        1
      /   \
     2     3
    / \   / \
   4   5 6   7

这个完全二叉树有7个节点,深度为3。它满足完全二叉树的两个条件,所有叶子节点都在最后一层,最后一层的叶子节点都靠左排列。除了最后一层,其他层的节点个数都是满的。节点1的左子节点为2,右子节点为3,节点2的左子节点为4,右子节点为5,节点3的左子节点为6,右子节点为7。

合并二叉树

例题:

给定两个二叉树,将它们合并为一个新的二叉树。合并规则是:如果两个节点重叠,那么将它们的值相加作为新节点的值;否则不为 NULL 的节点将直接作为新节点。

示例:

输入:

Tree 1                     Tree 2                  
     1                         2                             
    / \                       / \                            
   3   2                     1   3                        
  /                           \   \                      
 5                             4   7             

输出:
合并后的树:

     3
    / \
   4   5
  / \   \ 
 5   4   7

源码:

/**
 * 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 == NULL) {
            return t2;
        }
        if (t2 == NULL) {
            return t1;
        }
        TreeNode* root = new TreeNode(t1->val + t2->val);
        root->left = mergeTrees(t1->left, t2->left);
        root->right = mergeTrees(t1->right, t2->right);
        return root;
    }
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AcerMr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值