前言
LeetCode题目:LeetCode 110、257、404
Takeaway:今天主要考察的就是回溯了,回溯和递归是一体的,其区别就是回溯在每次递归结束后要进行回退,仅此而已。
一、110
递归解决,没什么说的,比较轻松。
/**
* 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:
int flag = 1;
int max(int i, int j)
{
if(i>j) //很明显的比大小了
return i;
else
return j;
}
int judgeBalanced(TreeNode* root){
if(root == NULL){
return 0;
}
int left_hight = judgeBalanced(root->left);
int right_hight = judgeBalanced(root->right);
if(left_hight>right_hight+1 || left_hight+1<right_hight){
flag = 0;
}
// 这里别忘了每层的深度要+1
return max(left_hight+1, right_hight+1);
}
bool isBalanced(TreeNode* root) {
judgeBalanced(root);
if(flag == 0){
return false;
}else{
return true;
}
}
};
二、257
对我来说,这题主要难度在字符串的处理上,我一开始并没有缕清递归函数的参数和返回值,这是导致我卡住的主要原因,本题递归的数据就是path,到达递归出口后就统计路径并添加至结果,每次递归返回后别忘了回溯,不然path只会一直增加。
/**
* 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:
// path 就是到目前为止的劝=全部节点的值,result是数个string
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
path.push_back(cur->val);
if(cur->left == NULL && cur->right == NULL){
// 一条路径用sPath表示,只有到底才会打印,之后放入result中
string sPath;
for(int i=0;i<path.size()-1;i++){
sPath += to_string(path[i]);
sPath += "->";
}
sPath += to_string(path[path.size()-1]);
result.push_back(sPath);
return;
}
if(cur->left != NULL){
traversal(cur->left, path, result);
path.pop_back();
}
if(cur->right != NULL){
traversal(cur->right, path, result);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL) {
return result;
}
traversal(root, path, result);
return result;
}
};
三、404
这题就是递归逻辑有点绕,不过由于最终结果是输出加和,也不需要回溯了,这题递归逻辑就是,递归左子树左子和,找到左子后加入到sum里,递归右子树左子和,左右子树左子和相加。
/**
* 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:
int sumLeft(TreeNode* root){
//出口,当前是空,自然返回0
if(root == NULL){
return 0;
}
//出口,当前左右全是空,是叶子了,要回去看看是做还是右叶子
if(root->left==NULL && root->right==NULL){
return 0;
}
//开始每层逻辑,每层的左子树之和都是左孩子的左子树之后+右孩子的左子树之和,这里先找左孩子的左子树之后
int leftv = sumLeft(root->left);
//左孩子(孩子的左右都为空)为叶子,加上她它的值
if(root->left!=NULL && root->left->left==NULL && root->left->right==NULL){
leftv = root->left->val;
}
//右孩子的左子树之和
int rightv = sumLeft(root->right);
//加和
int sum = leftv+rightv;
return sum;
}
int sumOfLeftLeaves(TreeNode* root) {
int res = sumLeft(root);
return res;
}
};
总结
今天题主要是递归的每层逻辑变得复杂了,有点绕,其中还夹杂了回溯的思路。