1. 是否是平衡二叉树
平衡二叉树,左右最大深度差不能为1,那就求最大深度差做对比。如果差的绝对值大于1,就返回-1终止递归,即不平衡。
class Solution {
public:
int getdepth(TreeNode* node){
if (node == NULL) {
return 0;
}
int leftHeight = getdepth(node->left);
if (leftHeight == -1) return -1;
int rightHeight = getdepth(node->right);
if (rightHeight == -1) return -1;
return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);
}
bool isBalanced(TreeNode* root) {
return getdepth(root) == -1? false:true;
}
};
题例:110. 平衡二叉树
2. 二叉树的所有路径
一个比较困惑的点在于所有路径的表现形式,重点在于如何把每一个叶子节点回溯到根节点。使用string回溯路径。
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++) { // 将path里记录的路径转为string格式
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> string;
vector<int>path;
traversal(root,path,string);
return string;
}
};
3. 左叶子之和
左叶子指的是没有子节点的左 叶节点,求的是左子树左叶子节点和右子树右子节点之和。
判断左子节点是否存在子节点,找到左叶子节点,然后对右子树用同样的方法,求和。
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == NULL)return 0;
if(root->left == NULL&&root->right == NULL)return 0;
int leftvalue = sumOfLeftLeaves(root->left);
if(root->left&&!root->left->left&&!root->left->right){
leftvalue = root->left->val;
}
int rightvalue = sumOfLeftLeaves(root->right);
int sum = leftvalue + rightvalue;
return sum;
}
};
题例:404. 左叶子之和