110.平衡二叉树
这题的关键有两个:一个是如果任意节点的字数不满足平衡二叉树,就可以直接返回false,不需要遍历其它的节点。第二个就是所有的节点都需要判断,因为不知道哪个节点的字数不满足条件。
class Solution {
public:
int getheight(TreeNode* root)
{
if(root==nullptr)return 0;
int leftlen=getheight(root->left);
if(leftlen==-1)return -1;
int rightlen=getheight(root->right);
if(rightlen==-1)return -1;
return abs(leftlen-rightlen)>1?-1:1+max(leftlen,rightlen);
//该层的长度将作为上个节点的左子树/右子树的长度。
}
bool isBalanced(TreeNode* root) {
if(getheight(root)==-1)
return false;
return true;
}
};
首先,每一个节点都需要考虑其子树是否满足条件,所以可以采用迭代。
迭代需要分别考虑root的left和right,返回左|右子树高度的最大值+1(因为当前节点也需要计算所以加1)。
这里-1的设计很好,个人理解为1-(-1)>1,所以即使是另一边子树是只有一个节点的极端情况,也能确保将-1数据传递给出去。
257. 二叉树的所有路径
class Solution {
public:
void TreePaths(TreeNode* root,vector<string>&result,vector<int>&v1)
{
v1.push_back(root->val);
if(root->left)
{
TreePaths(root->left,result,v1);
v1.pop_back();
}
if(root->right)
{
TreePaths(root->right,result,v1);
v1.pop_back();
}
if(root->left==nullptr&&root->right==nullptr)
{
string std;
for(int i=0;i<v1.size()-1;i++)
{
std+=to_string(v1[i]);
std+="->";
}
std+=to_string (v1[v1.size()-1]);
result.push_back(std);
return;
}
}
vector<string> binaryTreePaths(TreeNode* root)
{
vector<string>result;
vector<int>v1;
TreePaths(root,result,v1);
return result;
}
};
404.左叶子之和
迭代法只要能够遍历整个二叉树就行,主要还是分辨左叶子,要通过节点的父节点来判断其左孩子是不是左叶子了。
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
queue<TreeNode*>q1;
if(root!=nullptr)q1.push(root);
int sum=0;
while(!q1.empty())
{
int size=q1.size();
for(int i=0;i<size;i++)
{
TreeNode*t1=q1.front();
q1.pop();
if(t1->left)
{
q1.push(t1->left);
if(t1->left->left==nullptr&&t1->left->right==nullptr)
//判断是不是左叶子
sum+=(t1->left->val);
}
if(t1->right)q1.push(t1->right);
}
}
return sum;
}
};