平衡二叉树
递归,对左右子树的深度进行计算,每当左右子树深度相差大于1时,即不平衡。
具体参考代码随想录。
class Solution {
public:
int tree_depth(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int left = tree_depth(root->left);
int right = tree_depth(root->right);
if (left == -1 || right == -1 || abs(left - right) > 1) {
return -1; // 使用-1表示不平衡
}
return max(left, right) + 1;
}
bool isBalanced(TreeNode* root) {
return tree_depth(root) != -1;
}
};
算法的时间复杂度和空间复杂度为O(n)。
二叉树的所有路径
考虑使用递归,首先创建一个递归辅助函数,用于构建路径,路径从根节点开始往下,考虑前序遍历,递归辅助函数接受三个参数:当前节点root、当前构建的路径path和存储所有路径的字符串数组pahs,先判断根节点是否为空,若不为空,则添加根节点的值(这里要转换为string,使用to_string(root->val)),如果当前节点非叶子节点,则递归调用左子节点和右子节点,并将所有的路径都记录在字符串数组paths中。
class Solution {
public:
void construct_paths(TreeNode* root, string path, vector<string>& paths) {
if (root != nullptr) {
path += to_string(root->val);
if (root->left == nullptr && root->right == nullptr) { // 当前节点是叶子节点
paths.push_back(path); // 把路径加入到答案中
} else {
path += "->"; // 不是叶子节点,继续递归
construct_paths(root->left, path, paths);
construct_paths(root->right, path, paths);
}
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> paths;
construct_paths(root, "", paths);
return paths;
}
};
算法的时间复杂度和空间复杂度均为O(n),此外,这个方法相当于实现了DFS(深度优先搜索)
左叶子之和
这里引入一个isLeft变量,判断当前节点是否为左节点,当为左节点且为叶子节点时,将值相加并返回。
class Solution {
public:
// 函数sumOfLeftLeaves递归地计算所有左叶子节点的值之和
// 参数root是当前节点的指针,isLeft是一个标志,表示当前节点是否是左节点
int sumOfLeftLeaves(TreeNode* root, bool isLeft = false) {
// 如果当前节点为空,则返回0
if (root == nullptr) {
return 0;
}
// 检查当前节点是否是叶子节点(没有左右子节点)且是左节点
if (root->left == nullptr && root->right == nullptr && isLeft) {
// 如果是左叶子节点,返回该节点的值
return root->val;
}
// 递归计算左子树的左叶子节点之和,将isLeft标志设置为true
int leftSum = sumOfLeftLeaves(root->left, true);
// 递归计算右子树的左叶子节点之和,将isLeft标志设置为false
int rightSum = sumOfLeftLeaves(root->right, false);
// 返回左右子树的左叶子节点之和
return leftSum + rightSum;
}
};
算法的时间复杂度为O(n),因为算法需要访问树中的每个节点一次来判断是否为左叶子节点并计算总和。空间复杂度也为O(n),这里空间复杂度主要由递归栈的深度决定,这取决于树的高度,在最差情况下,树完全不平衡,则空间复杂度为O(n),最好情况下,树为平衡二叉树,空间复杂度为O(logn),总体来说,空间复杂度为O(n)。
对树的递归操作似乎空间复杂度和时间复杂度均为O(n)。