主要学习递归法,迭代法等二刷再继续学习
110.平衡二叉树
题目:给定一个二叉树,判断它是否是高度平衡的二叉树。
求高度、是后序遍历
class Solution {
public:
// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1
//求高度——后序遍历 左右中
int getHeight(TreeNode* node){
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;
//如果左右子树高度差大于1,那么不是平衡二叉树,返回-1
if(abs(leftHeight - rightHeight) > 1)
return -1;
else
result = 1 + max(leftHeight,rightHeight);
return result;
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
};
257. 二叉树的所有路径
class Solution {
public:
//path记录单条路径,vector 结构来记录路径,引用传入,为了方便展示回溯过程。
//result记录的是最后的结果
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result){
path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中
//递归终止条件: 当 cur不为空,其左右孩子都为空的时候,就找到叶子节点。
if (cur->left == NULL && cur->right == NULL) { // 遇到叶子节点
// 将path里记录的路径转为string格式,符合leetcode输出格式
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(); // 回溯
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL) return result;
traversal(root, path, result);
return result;
}
};
404.左叶子之和
节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下:
if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
左叶子节点处理逻辑
}
递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
//终止条件
if (root == NULL) return 0;
//只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,
//那其左叶子也必定是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;
}
};