110. 平衡二叉树
题目链接:704. 二分查找
文档讲解:代码随想录
思路
使用后序遍历,求出以各结点为根结点的左右子树的高度,如果右左右子树高度差大于1,则返回false
,如果所有左右子树高度差都小于1,则返回true
。
代码
左闭右开区间代码
class Solution {
public:
bool isBalanced(TreeNode* root) {
if (root == NULL)
return true;
int result = getHeight(root);
if (result == -1)
return false;
return true;
}
int getHeight(TreeNode* node) {
if (node == NULL)
return 0;
int leftHeight = getHeight(node->left);
int rightHeight = getHeight(node->right);
if (leftHeight == -1 || rightHeight == -1)
return -1;
if (abs(leftHeight - rightHeight) > 1)
return -1;
return 1 + max(leftHeight, rightHeight);
}
};
257. 二叉树的所有路径
题目链接:257. 二叉树的所有路径
文档讲解:代码随想录
思路
使用前序遍历递归,同时用一个path
变量记录当前路径,当遇到叶子结点时,将当前路径加入result
数组中,在递归时,将path回溯至入递归前。
代码
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL)
return result;
traversal(root, path, result);
return result;
}
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
path.push_back(cur->val);
if (cur->left == NULL && cur->right == NULL) {
string subPath;
for (int i = 0; i < path.size() - 1; i++) {
subPath += to_string(path[i]);
subPath += "->";
}
subPath += to_string(path[path.size() - 1]);
result.push_back(subPath);
return;
}
if (cur->left) {
traversal(cur->left, path, result);
path.pop_back();
}
if (cur->right) {
traversal(cur->right, path, result);
path.pop_back();
}
}
};
编写相向双指针方法代码时需要注意while
的循环条件为<=
,若不加=
,则当左右指针重合时,则未判断该处的值是否是要被删除的值。
404.左叶子之和
题目链接:404.左叶子之和
文档讲解:代码随想录
思路
使用后序遍历递归,在处理中间结点时,判断当前结点的左结点是否为叶子结点,如果是叶子结点则将该结点的值加到result
中。
代码
class Solution {
public:
int sumOfLeftLeaves(TreeNode *root) {
result = 0;
traversal(root);
return result;
}
private:
int result;
void traversal(TreeNode *node) {
if (node == NULL)
return;
traversal(node->left);
traversal(node->right);
if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
result += node->left->val;
return;
}
}
};