题目:257.二叉树的所有路径
回溯
class Solution {
private:
void traversal(TreeNode *cur, vector<int>& path, vector<string>& result){
path.push_back(cur->val); //中
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(); //回溯:弹出上一层push进去的节点
}
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) traversal(root, path, result);
return result;
}
};
题目:110.平衡二叉树
比较左右子树和统计左右子树高度的道理一样,都应该用后序遍历
class Solution {
public:
int getHeight(TreeNode *node){
if(node == NULL) return 0;
int leftHeight = getHeight(node->left);
if(leftHeight == -1) return -1; //如果左子树不是平衡二叉树,则该节点所对应的树也不是
int rightHeight = getHeight(node->right);
if(rightHeight == -1) return -1; //如果左子树不是平衡二叉树,则该节点所对应的树也不是
int result;
if(abs(leftHeight - rightHeight) > 1) return -1; //左右子树高度差大于1,则不是平衡二叉树
else result = 1 + max(leftHeight, rightHeight);
return result;
}
bool isBalanced(TreeNode* root) {
if(getHeight(root) == -1) return false;
else return true;
}
};
题目:404.左叶子之和
尝试作答:遍历到叶子节点时,判断不了其是左叶子还是右叶子,所以要在遍历到叶子节点上一个节点时就进行判断,这是本题和其他二叉树不同的地方。
其次,应该用后序遍历。父节点的左叶子之和就是左子树的左叶子之和加上右子树的左叶子之和。
遇到的问题:在尝试解答时不知道传入参数应该怎么设置,才能讲加和不断返回给上一层。
自己写的错误代码如下:
class Solution {
public:
int sumLeftLeaves(TreeNode *node,int sum){
if(node->left && node->left->left == NULL && node->left->right == NULL) return sum += node->left->val;
int leftsum, rightsum;
if(node->left) leftsum = sumLeftLeaves(node->left, leftsum);
if(node->right) rightsum = sumLeftLeaves(node->right, rightsum);
int result = leftsum + rightsum;
return result;
}
int sumOfLeftLeaves(TreeNode* root) {
int result = 0;
if(root != NULL) result = sumOfLeftLeaves(root, result);
return result;
}
};
错误的点在于,自己写的终止条件,应该作为单层递归的处理才对。
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == NULL) return 0;
if(root->left == NULL && root->right == NULL) return 0;
int leftsum = sumOfLeftLeaves(root->left);
int rightsum = sumOfLeftLeaves(root->right);
int result;
if(root->left && root->left->left == NULL && root->left->right == NULL) return rightsum + root->left->val;
//这里的返回值有点绕
else result = leftsum + rightsum;
return result;
}
};