给定一个二叉树,判断它是否是高度平衡的二叉树。
思路:遍历每一个节点,判断其左右字数高度差
class Solution {
public:
int getHigh(TreeNode* root){
//递归出口
if(!root)return 0;
//左子树高度
int l = dfs(root->left);
//右子树高度
int r = dfs(root->right);
//最大高度
return max(l,r)+1;
}
bool isBalanced(TreeNode* root) {
if(!root)return true;
int l = getHigh(root->left);
int r = getHigh(root->right);
//高度差大于1返回false
if(l-r>1 || l-r<-1)return false;
//所有节点都判断成功返回true
return isBalanced(root->left) && isBalanced(root->right);
}
};
时间复杂度 O(n^2) 空间复杂度 O(n)
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
思路:遍历所有节点,遍历过程将节点储存到容器中,当遇到叶子结点把其放到结果集中
注意:这里要用先序遍历,而且要有回溯过程
class Solution {
public:
vector<string>res;
vector<int>path;
void dfs(TreeNode* root){
path.push_back(root->val);
if(!root->left && !root->right){
string s;
for(int i=0;i<path.size();++i){
s += to_string(path[i]);
if(i<path.size()-1)
s += "->";
}
res.push_back(s);
}
if(root->left){
dfs(root->left);
//回溯
path.pop_back();
}
if(root->right){
dfs(root->right);
//回溯
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
if(!root)return res;
dfs(root);
return res;
}
};
给定二叉树的根节点 root
,返回所有左叶子之和。
思路:先序遍历所有节点,当遍历到左叶子节点相加,这里要加一个先驱节点记录父亲
class Solution {
public:
int sum;
void dfs(TreeNode* pre,TreeNode* root){
if(pre!=NULL && pre->left==root && (!root->left&&!root->right)){
sum += root->val;
}
if(root->left)dfs(root,root->left);
if(root->right)dfs(root,root->right);
}
int sumOfLeftLeaves(TreeNode* root) {
TreeNode* pre = NULL;
dfs(pre,root);
return sum;
}
};