力扣做题记录——算法入门day8


  今天的两道题主要和二叉树的结构有关。

617.合并二叉树

  给你两棵二叉树:root1root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。
  注意: 合并过程必须从两个树的根节点开始。
示例1
在这里插入图片描述

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

示例2

输入:root1 = [1], root2 = [1,2]
输出:[2,2]

提示

  • 两棵树中的节点数目在范围[0, 2000]
  • -10^4 <= Node.val <= 10^4

代码

// 方法1 不使用新二叉树
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
    if (root1 == NULL) return root2; // 如果树1空,返回树2
    if (root2 == NULL) return root1; // 如果树2空,返回树1
    root1->val += root2->val; // 把树2叠加到树1上
    root1->left = mergeTrees(root1->left,root2->left); // 递归调用,向左右两子树遍历
    root1->right = mergeTrees(root1->right,root2->right);
    return root1;
}
  
// 方法2 使用新二叉树
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
	if (root1 == NULL && root2 == NULL) return NULL;
    TreeNode * root = new TreeNode((root1 == NULL?0:root1->val)+(root2 == NULL?0:root2->val));
    root->left = mergeTrees(root1 == NULL?NULL:root1->left, root2 == NULL?NULL:root2->left);
    root->right = mergeTrees(root1 == NULL?NULL:root1->right, root2 == NULL?NULL:root2->right);
    return root;
}

// 方法3 使用新二叉树,但更符合题意中“不为NULL的节点将直接作为新二叉树的节点”
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
	if (root1 == null) {
       return root2;
    }
    if (root2 == null) {
        return root1;
    }
    // 先合并根节点
    TreeNode root = new TreeNode(root1->val + root2->val);
    // 再递归合并左右子树
    root->left = mergeTrees(root1->left, root2->left);
    root->right = mergeTrees(root1->right, root2->right);
    return root;
}

116.填充每个节点的下一个右侧节点

  给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

  填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为NULL。初始状态下,所有 next 指针都被设置为NULL
示例1
在这里插入图片描述

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

示例2

输入:root = [ ]
输出:[ ]

代码
  这道题主要是搞明白节点之间的关系,由于是完全二叉树,因此left指针存在的节点right指针也存在,left的next指针指向right。如果root的next存在,则root的right指针应指向next的left。

Node* connect(Node* root) {
    if (root == NULL) return NULL;
    if (root->left != NULL)
    {
        root->left->next = root->right;
        if (root->next != NULL)
        root->right->next = root->next->left;
    }
    connect(root->left);
    connect(root->right);
    return root;       
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值