110.平衡二叉树
int返回以t为根的子树的高度,如果不符合条件,返回-1;
class Solution {
public:
int dfs(TreeNode* t){
if(t==NULL) return 0;
int l=dfs(t->left);
int r=dfs(t->right);
if(l==-1||r==-1) return -1;
return abs(l-r)>1?-1:1+max(l,r);
}
bool isBalanced(TreeNode* root) {
return dfs(root)==-1?false:true;
}
};
257.二叉树的所有路径
path记录路径,回溯的时候pop,递归到叶子节点返回;
class Solution {
public:
void dfs(TreeNode* t,vector<int> &path,vector<string> &ans){
path.push_back(t->val);
if(t->left==nullptr&&t->right==nullptr){
string s;
for(int i=0;i<path.size()-1;i++){
s+=to_string(path[i]);
s+="->";
}
s+=to_string(path[path.size()-1]);
ans.push_back(s);
return;
}
if(t->left!=nullptr){
dfs(t->left,path,ans);
path.pop_back();
}
if(t->right!=nullptr){
dfs(t->right,path,ans);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> ans;
vector<int> path;
if(root==nullptr) return ans;
dfs(root,path,ans);
return ans;
}
};
404.左叶子之和
左叶子:A有左孩子,且A的左孩子没有孩子,那么A的左孩子为左叶子;
class Solution {
public:
int dfs(TreeNode* t){
if(t->left==nullptr&&t->right==nullptr) return 0;
int l=0,r=0;
if(t->left!=nullptr) l=dfs(t->left);//若t的左孩子为叶子节点,会返回来0,l为0,若不是,返回的是左子树左叶子和sum
if(t->right!=nullptr) r=dfs(t->right);
int sum=l+r;
if(t->left!=nullptr&&t->left->left==nullptr&&t->left->right==nullptr){
sum+=t->left->val;
}
return sum;
}
int sumOfLeftLeaves(TreeNode* root) {
if(root==nullptr) return 0;
return dfs(root);
}
};