题目链接:110. 平衡二叉树 - 力扣(LeetCode)
class Solution
{
public:
int getHeight(TreeNode *root){
if(root==nullptr) return 0;//高度为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)
{
return getHeight(root)!=-1;
}
};
难以理解的递归。
递归出口是为空,就返回0,如果左右差大于1,就返回-1一直到结束。
本质上就是一层层不断往下递归,先左后右,最终返回来的应该是高度。
题目链接:257. 二叉树的所有路径 - 力扣(LeetCode) 、
class Solution
{
public:
void traversal(TreeNode *cur, vector<string> &result, string path)
{
path += to_string(cur->val);
if (!cur->left && !cur->right)
{
result.push_back(path);
return;
}
if(cur->left) traversal(cur->left,result,path+"->");
if(cur->right) traversal(cur->right,result,path+"->");
}
vector<string> binaryTreePaths(TreeNode *root)
{
vector<string> result;
string path;
if (!root)
return result;
traversal(root,result,path);
return result;
}
};
又是递归,又是不会。
递归出口是左右孩子都为空,证明这个是叶子结点。
难点一是怎么写出这个递归,这是我不会的地方。
难点二是string path怎么一个个保存到最后,而且中间还得有箭头。解决办法是在函数参数里面一个个传递下去,并且每次都+一个箭头。真的是没见过的方法,耳目一新。
题目链接:404. 左叶子之和 - 力扣(LeetCode)
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right== NULL) return 0;
int leftValue = sumOfLeftLeaves(root->left); // 左
if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况
leftValue = root->left->val;
}
int rightValue = sumOfLeftLeaves(root->right); // 右
int sum = leftValue + rightValue; // 中
return sum;
}
};
通过上面2道题,这道倒是有一点递归的思路。最后还是看了答案。
就递归的终点应该在有左子树但是左子树没有孩子。就这里会返回一个值,其他情况返回0;
结果通过leftvalue和rightvalue一层层传递出来。