110.平衡二叉树
class Solution {
public:
//深度与高度前序与后序一个很大的差别是需不需要向上返回结果
int height(TreeNode* Node) { //要思考下这个题返回变量是bool还是int
if(Node == NULL) return 0;
int left_height = height(Node -> left); //左
if (left_height == -1) return -1; //这一句一开始没写,不写在一些特殊二叉树会出问题;
int right_height = height(Node -> right);//右
if (right_height == -1) return -1;
int middle_height;
if(abs(left_height - right_height) > 1){
middle_height = -1;
} else {
middle_height = 1 + max(left_height, right_height); //中,这个中的写法和之前不一样,还要分类写
}
return middle_height;
}
bool isBalanced(TreeNode* root) {
return height(root) == -1 ? false : true;
}
};
下面那句如果不写的话,那么下面那个例子回返回左子树高度-1,右子树高度也是-1. 然后高度差算出来小于1,最后就会返回结果说这是个平衡二叉树; 主要是因为当得到第一个-1的时候递归还没有结束,不人为结束的话这个结果会被后面的递归改变
if (left_height == -1) return -1;
257. 二叉树的所有路径
有难度,写不出
class Solution {
private:
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中,由于终止条件是在叶子结点而不是在空节点,所以这个收集的过程才需要在这里
// 这才到了叶子节点
if (cur->left == NULL && cur->right == NULL) {
string sPath;
for (int i = 0; i < path.size() - 1; i++) {
sPath += to_string(path[i]);
sPath += "->";
}
sPath += to_string(path[path.size() - 1]);
result.push_back(sPath);
return;
}
if (cur->left) { // 左
traversal(cur->left, path, result);
path.pop_back(); // 回溯,会后退一位
}
if (cur->right) { // 右
traversal(cur->right, path, result);
path.pop_back(); // 回溯会后退一位;
}
}
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL) return result;
traversal(root, path, result);
return result;
}
};
404.左叶子之和
递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。
class Solution {
public:
int sum(TreeNode* node) {
if(node == NULL) return 0;
int left = sum(node->left);
if(node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
left = node->left->val;
}
int right = sum(node->right); //右
int sum = left + right; //中
return sum;
}
int sumOfLeftLeaves(TreeNode* root) {
int result = sum(root);
return result;
}
};