代码随想录算法训练营第十七天 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和
110.平衡二叉树
题目链接 文章讲解 视频讲解
定义:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1
递归法(后序)
class Solution {
public:
bool isBalanced(TreeNode* root) {
if(root == nullptr) return true;
// 求左子树高度
int leftDepth = getDepth(root->left); // 左
// 求右子树高度
int rightDepth = getDepth(root->right); // 右
int result = abs(leftDepth - rightDepth); // 中
// 如果当前节点平衡则后续遍历,求左右子树是否平衡
if(result <= 1) {
return isBalanced(root->left) && isBalanced(root->right);
}
return false;
}
// 求数的最大高度(后序)
int getDepth(TreeNode* node) {
int depth = 0;
if(node == nullptr) return 0;
int left = getDepth(node->left); // 左
int right = getDepth(node->right); // 右
int result = 1 + max(left, right); // 中
return result;
}
};
257.二叉树的所有路径
回溯法

思路:由于是求根节点到叶节点的路径,所以选择先序遍历
访问根节点,并将根节点压栈
先序遍历左子树,并将访问到的节点入栈;
访问到叶节点时,将当前路径回收
回溯,出栈;
先序遍历右子树,并将访问到的节点入栈;
访问到叶节点时,将当前路径回收
回溯,出栈;
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if(root == nullptr) return {};
traversal(root, result, path);
return result;
}
void traversal(TreeNode* node, vector<string>& result, vector<int>& path) {
// 再回收路径前将当前节点添加到路径中
path.push_back(node->val);
// 当遍历到叶节点时,当前路径结束,回收路径
if(node->left == nullptr && node->right == nullptr) {
result.push_back(pathToString(path));
return ;
}
// 先序遍历左子树
if(node->left) {
traversal(node->left, result, path);
// 回溯
path.pop_back();
}
// 先序遍历右子树
if(node->right) {
traversal(node->right, result, path);
// 回溯
path.pop_back();
}
}
// 转换路径格式
string pathToString(vector<int>& path) {
string path_s = "";
for(int val : path) {
path_s += to_string(val);
path_s += "->";
}
path_s.resize(path_s.size()-2);
return path_s;
}
};
404.左叶子之和
左叶子节点,node->left != nullptr && node->left->left == nullptr && node->right == nullptr
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == nullptr) return 0;
int leftValue = 0;
if(root->left != nullptr && root->left->left == nullptr && root->left->right == nullptr)
leftValue = root->left->val;
return leftValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
}
};

浙公网安备 33010602011771号