题目链接:110.平衡二叉树
递归比较二叉树各节点子树高度差是否不大于1。
class Solution {
public:
bool isBalanced(TreeNode* root) {
if(root == nullptr || getHight(root) != -1) return true;
else return false;
}
int getHight(TreeNode* node) {
if(node == nullptr) return 0;
int left = getHight(node->left);
if(left == -1) return -1;
int right = getHight(node->right);
if(right == -1) return -1;
if(left - right <= 1 && left - right >= -1) return 1 + max(left, right);
else return -1;
}
};
题目链接:257. 二叉树的所有路径
回溯法
第一次自己写的很乱,有的代码段没必要,有的写得不够精简
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
string s;
backtracking(root, s, result);
return result;
}
void backtracking(TreeNode* node, string& s, vector<string>& vec) {
if (node == nullptr) {
s.pop_back();
s.pop_back();
vec.push_back(s);
s = s + "->";
return;
}
s = s + to_string(node->val) + "->";
if (node->left == nullptr && node->right != nullptr)
backtracking(node->right, s, vec);
else if (node->right == nullptr && node->left != nullptr)
backtracking(node->left, s, vec);
else if (node->right == nullptr && node->left == nullptr) {
s.pop_back();
s.pop_back();
vec.push_back(s);
s = s + "->";
}
else {
backtracking(node->right, s, vec);
backtracking(node->left, s, vec);
}
s.pop_back();
s.pop_back();
while (s.size() > 0 && * (s.end() - 1) != '>') s.pop_back();
}
};
看完视频写了一个还算满意的版本
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
string str;
frontReaversal(root, str, result);
return result;
}
void frontReaversal(TreeNode* node, string& s, vector<string>& vec) {
s = s + to_string(node->val) + "->";
if(node->left == nullptr && node->right == nullptr){
s.pop_back();
s.pop_back();
vec.push_back(s);
s = s + "->";
}
if(node->left != nullptr) {
frontReaversal(node->left, s, vec);
}
if(node->right != nullptr) {
frontReaversal(node->right, s, vec);
}
s.pop_back();
s.pop_back();
while(s.size() > 0 && *(s.end() - 1) != '>') s.pop_back();
}
};
题目链接:404.左叶子之和
自己一次就写出来比较精炼的代码,但是完全没考虑是以哪种方式遍历。
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == nullptr || (root->left == nullptr && root->right == nullptr))
return 0;
else if(root->left != nullptr && root->left->right == nullptr && root->left->left == nullptr)
return root->left->val + sumOfLeftLeaves(root->right);
else return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
}
};