本题要判断平衡二叉树,即求每个结点的左右子树深度之差是否超过一,因此本题可以使用递归的方法判断每一个结点的左右子树深度之差,借助求结点深度的辅助函数来判断是否为平衡二叉树。
具体代码如下:
class Solution {
public:
bool isBalanced(TreeNode* root) {
if(root==NULL)
{
return true;
}
else if(abs(getheight(root->left)-getheight(root->right))>1)
{
return false;
}
else
{
return isBalanced(root->left)&&isBalanced(root->right);
}
}
int getheight(TreeNode*root)
{
if(root==NULL)
{
return 0;
}
return max(getheight(root->left),getheight(root->right))+1;
}
};
本题要求根结点到叶子结点的所有路径,此处采用前序遍历的方法,每次递归现将结点值加入路径数组再将左右子树进行递归遍历,最终到达叶子结点时将路径数组中的路径加入结果数组,代码实现过程中要注意回溯的使用,为了求出多条路径,在每加入一个结点并求出通过该结点的路径后应该将该结点值弹出,这样才能回溯到起始结点进行另一条路径的探查。
具体代码如下:
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string>st;
vector<int>path;
if(root==NULL)
{
return st;
}
getpath(root,path,st);
return st;
}
void getpath(TreeNode*root,vector<int>&path,vector<string>&result)
{
path.push_back(root->val);
if(root->left==NULL&&root->right==NULL)
{
string s;
for(int i=0;i<path.size()-1;i++)
{
s+=to_string(path[i]);
s+="-";
s+=">";
}
s+=to_string(path[path.size()-1]);
result.push_back(s);
return;
}
if(root->left)
{
getpath(root->left,path,result);
path.pop_back();
}
if(root->right)
{
getpath(root->right,path,result);
path.pop_back();
}
}
};
本题要求所有左结点值的和,因此需要判断什么结点是左结点,不但其左右结点为空而且要为其父结点的左结点,因此需要借助叶子结点的父结点来判断,同样是递归的遍历根结点的左右子树将其左右子树中左结点值的和相加即为所求。
具体代码如下:
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root==NULL)
{
return 0;
}
else if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL)
{
return root->left->val+sumOfLeftLeaves(root->right);
}
else if(root->right!=NULL&&root->right->left==NULL&&root->right->right==NULL)
{
return sumOfLeftLeaves(root->left);
}
return sumOfLeftLeaves(root->right)+sumOfLeftLeaves(root->left);
}
};