110. 平衡二叉树
自己先做了个等于是两个递归的做法但是效果还可以。
class Solution {
public:
int getHigh(TreeNode* node){
if(node==nullptr)return 0;
return (1+max(getHigh(node->left),getHigh(node->right)));
}
bool isBalanced(TreeNode* root) {
if(root==nullptr)return 1;
if(!isBalanced(root->left)||!isBalanced(root->right))return 0;
if(getHigh(root->left)-getHigh(root->right)<=1&&getHigh(root->left)-getHigh(root->right)>=-1)return 1;
return 0;
}
};
其实就用int返回-1也可以代表false。
class Solution {
public:
int getHight(TreeNode* node){
if(node==nullptr)return 0;
int a=getHight(node->left);
int b=getHight(node->right);
if(a==-1||b==-1)return -1;
if(abs(a-b)<=1)
return 1+max(a,b);
else return -1;
}
bool isBalanced(TreeNode* root) {
if(root==nullptr)return 1;
int a=getHight(root);
if(a==-1)return 0;
else return 1;
}
};
递归函数中自身不能出现太多次。
257. 二叉树的所有路径
记住递归和回溯,在这个过程中吸收又吐出结点。
public:
void traversal(TreeNode* node,string path,vector<string> &sPath){
path+=to_string(node->val);
if(node->left==nullptr&&node->right==nullptr){
sPath.push_back(path);
return;
}
if(node->left)traversal(node->left,path+"->",sPath);
if(node->right)traversal(node->right,path+"->",sPath);
}
vector<string> binaryTreePaths(TreeNode* root) {
string path;
vector<string> sPath;
if(root==nullptr)return sPath;
traversal(root,path,sPath);
return sPath;
}
};
404. 左叶子之和
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root==nullptr)return 0;
if(root->left==nullptr&&root->right==nullptr)return 0;
int a;
a=sumOfLeftLeaves(root->left);
if(root->left!=nullptr&&!root->left->left&&!root->left->right) a= root->left->val;
int b=sumOfLeftLeaves(root->right);
return a+b;}
};
这个看似是简单的递归,但是逻辑要非常注意,寻找左叶子结点的逻辑,先向左递归,再if把左递归的值看看是否覆盖。也就是说什么时候在特殊情况改变递归要返回的值,这个方法要注意。