写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~
目录
题目一:617. 合并二叉树
题目描述:
题目分析:
这里我们将一棵二叉树合并到另一棵上即可,详细过程见代码注释。
题解代码:
/**
* 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==NULL) //去除NULL的部分
return root2;
if(root2==NULL)
return root1;
//将root2合并到root1上
root1->val+=root2->val; //根节点
root1->left=mergeTrees(root1->left,root2->left); //左节点
root1->right=mergeTrees(root1->right,root2->right); //右节点
return root1;
}
};
题目二:116. 填充每个节点的下一个右侧节点指针
题目描述:
题目分析:
首先是判断两种指向NULL的情况,树为空或者节点无孩子。其次再进行孩子节点next指针的连接,详细过程见代码注释。
题解代码:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
Node* connect(Node* root) {
if(root==NULL || root->right==NULL) //两种节点为空的情况
return root;
if(root->right!=NULL) //左子树中某节点若有右孩子,则将其左孩子的next指针指向右孩子
root->left->next=root->right;
if(root->next!=NULL) //右子树中若该节点的next指针已经建立好了,即已经指向了自己的兄弟,则它的右孩子的next指针便指向自己兄弟节点的左孩子
root->right->next=root->next->left;
connect(root->left); //递归处理剩下的节点
connect(root->right);
return root;
}
};