第一题:平衡二叉树
0.基础:二叉树的节点的深度指根节点到该节点的最长简单路径边的条数;二叉树的节点高度指该节点到叶子节点的最长简单路径边的条数。
1.高度平衡的二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1;
2.思路: 递归三步走:
1、判断递归函数的参数和返回值
参数:当前传入节点;返回值:以当前传入节点为根节点的树的高度
int getHeight(TreeNode* node)
2、明确终止条件
递归的过程中依然是遇上了空节点为终止,返回0,表示当前节点为根节点的树高度为0
if(node==NULL)
{return 0;}
3、确定单层递归的逻辑
分别求出当前节点的左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。
if(node==NULL) return 0;
int leftHeight=getHeight(node->left);
if(leftHeight==-1) return -1; // 左表示当前节点已经不是平衡二叉树了
int rightHeight=getHeight(node->right);
if(rightHeight==-1) return -1; //右
int result;
if(abs(leftHeight-rightHeight)>1) //中
{
result=-1;
}
else
{
result=1+max(leftHeight,rightHeight);
}
return result;
第二题:二叉树的所有路径
0.为什么马上就能判断出是前序遍历呢?
前序遍历:根左右,根在前,子节点在后,方便父节点指向孩子节点,找到对应的路径。
1. 回溯方法
三步骤:
(1)递归函数参数以及返回值
void traversal (TreeNode *cur,vector<int>& path,vector<int>& result)
(2)确定递归终止条件
本题终止情况是找到了叶子节点,也就是该节点没有左右孩子
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;
(3)确定单层循环逻辑
if(cur->left)
{
traversal(cur->left,path,result);
path.pop_back();
}
if(cur->right)
{
traversal(cur->right,path,result);
path.pop_back();
}
3. 一些函数
pop_back(); 将容器中最后一个元素要删除,则可以使用pop_back将其删除
push_back(); 放进容器内,后进先出
第三题:左叶子之和
首先左叶子是要上下都考虑,节点A的左孩子不为空,且左孩子的左右孩子都为空,这样的A节点的左孩子才是左叶子
1.要找到这个左叶子,需要通过他的父亲结点寻找
递归三部曲:
(1)确定递归函数参数和返回值
不需要单独写函数递归,直接在函数内循环就行
(2)确定终止条件
if(root==NULL) return 0;
if(root->left==NULL && root->right==NULL) return 0;
(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;
}
};