力扣做题记录——算法入门day8
今天的两道题主要和二叉树的结构有关。
617.合并二叉树
给你两棵二叉树:root1
和root2
。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 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