代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和
1.1 110.平衡二叉树
思路:
- 求深度可以从上到下去查,所以需要前序遍历(中左右)
- 求高度只能从下到上去查,所以只能后序遍历(左右中)
class Solution {
private:
int getHeight(TreeNode* node){
if(node == nullptr) return 0;
int leftHeight = getHeight(node->left);
if(leftHeight == -1) return -1;
int rightHeight = getHeight(node->right);
if(rightHeight == -1) return -1;
return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);
}
public:
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
};
1.2 257. 二叉树的所有路径
思路:
- 前序遍历,需要先处理中间节点
- 回溯就隐藏在
traversal(TreeNode* node, vector<int> &path)
,每次函数调用完,path已经添加了新的节点,所以需要pop_back
class Solution {
private:
vector<string> res;
void traversal(TreeNode* node, vector<int> &path){
path.push_back(node->val);
if(node->left == nullptr && node->right == nullptr){
string temp;
for(int i = 0; i < path.size()-1; ++i){
temp += to_string(path[i]);
temp += "->";
}
temp += to_string(path[path.size()-1]);
res.push_back(temp);
return;
}
if(node->left){
traversal(node->left, path);
path.pop_back();
}
if(node->right){
traversal(node->right, path);
path.pop_back();
}
}
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<int> path;
if (root == nullptr) return res;
traversal(root, path);
return res;
}
};
1.3 404.左叶子之和
思路:
- 判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子
- 递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right== NULL) return 0;
int leftValue = 0; // 左
if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况
leftValue = root->left->val;
}
else leftValue = sumOfLeftLeaves(root->left);
int rightValue = sumOfLeftLeaves(root->right); // 右
int sum = leftValue + rightValue; // 中
return sum;
}
};