对求二叉树高度和深度的思路应该十分清晰,并知道什么时候该求高度,什么时候该求深度,求高度用递归法和层序遍历都很方便,而求深度用递归法更好一些,层序遍历有些麻烦,关键在于前序遍历求深度,后序遍历求高度。
class Solution {
public:
int dfs(TreeNode* cur)
{
if (cur==nullptr) return 0;
int leftheight = dfs(cur->left);
if (leftheight==-1) return -1;
int rightheight = dfs(cur->right);
if (rightheight==-1) return -1;
return abs(leftheight-rightheight)>1 ? -1 : 1+max(leftheight, rightheight);
}
bool isBalanced(TreeNode* root)
{
return dfs(root)==-1 ? false : true;
}
};
class Solution {
public:
void dfs(TreeNode* cur, vector<string>& ans, string str)
{
if (cur->left==nullptr && cur->right==nullptr)
{
ans.push_back(str);
return;
}
if (cur->left != nullptr)
{
str += "->";
string val = to_string(cur->left->val);
str += val;
dfs(cur->left, ans, str);
for (int i=0; i<2+val.size(); i++) str.pop_back();
}
if (cur->right != nullptr)
{
str += "->";
string val = to_string(cur->right->val);
str += val;
dfs(cur->right, ans, str);
for (int i=0; i<2+val.size(); i++) str.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root)
{
vector<string> ans;
string str = "";
str += to_string(root->val);
dfs(root, ans, str);
return ans;
}
};
后序遍历
class Solution {
public:
void dfs(TreeNode* cur, int& ans)
{
if (cur->left!=nullptr)
{
dfs(cur->left,ans);
if (cur->left->left==nullptr && cur->left->right==nullptr) ans += cur->left->val;
}
if (cur->right!=nullptr) dfs(cur->right, ans);
}
int sumOfLeftLeaves(TreeNode* root)
{
int ans = 0;
dfs(root, ans);
return ans;
}
};