平衡二叉树
题目链接:力扣
平衡二叉树:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
所以应分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。
class Solution {
public:
bool isBalanced(TreeNode* root) {
if(!root)
return true;
if(getheight(root) != -1)
return true;
else
return false;
}
int getheight(TreeNode* root)
{
if (root == nullptr)
return 0;
int leftheight = getheight(root->left);
if (leftheight==-1) return -1; //若左子树已经不是平衡二叉树了,就直接往上返回-1即可
int rightheight = getheight(root->right);
if (rightheight==-1) return -1; //右子树和左子树同理
if(abs(leftheight-rightheight) >= 2)
return -1;
else
return 1+max(leftheight,rightheight);
}
};
二叉树的所有路径
题目链接:力扣
遍历顺序的选择:前序遍历,因为只有前序遍历,才能让父节点去指向其孩子节点,这样才能写出其顺序。
递归和回溯:其实只要有递归 就一定有回溯,两者是相辅相成的。
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL) return result;
recursion(root, path, result);
return result;
}
//path用于记录单条路径 result记录最后的集合
void recursion(TreeNode* cur, vector<int>& path, vector<string>& result)
{
path.push_back(cur->val); //最后一个节点也要加入到path中
if(cur->left == nullptr && cur->right == nullptr) //遇到叶子节点 返回处理后的路径
{
string strPath;
for(int i=0;i<path.size()-1;i++)
{
strPath += to_string(path[i]);
strPath += "->";
}
strPath += to_string(path[path.size()-1]);
result.push_back(strPath);
return;
}
if(cur->left)
{
recursion(cur->left,path,result);
path.pop_back(); //回溯
}
if(cur->right)
{
recursion(cur->right,path,result);
path.pop_back(); //回溯
}
}
};
网上很多题解表面上看没有回溯的过程,实际上其是将回溯的代码给隐藏掉了
左叶子之和
题目链接:力扣
左叶子节点:
节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
和之前做过的题目有所不同的是,这道题遍历到6这个点的时候,虽然可以判断他是不是叶子节点,但是无法判断其是否是父节点的左孩子。
所以只能遍历到9这个点的时候,判断其左孩子是否为空,若左孩子不为空,同时左孩子的左右孩子都为空,那么我们当前遍历的这个节点其左孩子就是我们要处理的值。
即通过父节点判断其子节点是不是我们想要收集的元素。
遍历顺序的选择:由于需要一层一层向上返回,所以采用后序遍历较为合适
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
return leftsum(root);
}
int leftsum(TreeNode* cur)
{
if(!cur) return 0;
if(!cur->left && !cur->right) return 0; //遇到叶子节点 但不是左叶子节点
int leftvalue = leftsum(cur->left); //左
if(cur->left && !cur->left->left && !cur->left->right)
leftvalue = cur->left->val;
int rightvalue = leftsum(cur->right); //右
return leftvalue+ rightvalue; //中
}
};