110.平衡二叉树
题目链接:110. 平衡二叉树
递归法
拿到题目首先想到了递归法,每次递归得到各结点左子树与右子树的高度差;
参数:树结点;返回值:高度(差);
终止条件:结点为空;
过程逻辑:某一结点的左右子树高度差若超过 1,则没必要继续求高度差了,整棵树已然不是平衡二叉树,返回 -1 以说明不平衡;否则返回高度;
class Solution {
public:
int getHeight(TreeNode* cur){
if(cur == NULL) return 0;
int leftHeight = getHeight(cur->left);
int rightHeight = getHeight(cur->right);
if(leftHeight == -1 || rightHeight == -1) return -1;
if(abs(leftHeight - rightHeight) <= 1){
return max(leftHeight, rightHeight) + 1;
}
return -1;
}
bool isBalanced(TreeNode* root) {
if(getHeight(root) == -1) return false;
else return true;
}
};
迭代法
暂空下,回头有时间补一下
257. 二叉树的所有路径
题目链接:257. 二叉树的所有路径
递归法
class Solution {
public:
vector<string> result;
void getpath(TreeNode* cur, string path){
if(cur == NULL) return;
path += to_string(cur->val);
// 若为叶节点,记录路径
if(!cur->left && !cur->right){
result.push_back(path);
}
if(cur->left) getpath(cur->left, path+"->");
if(cur->right) getpath(cur->right, path+"->");
}
vector<string> binaryTreePaths(TreeNode* root) {
if(root == NULL) return result;
getpath(root, "");
return result;
}
};
迭代法
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
stack<TreeNode*> treeSt;
stack<string> pathSt;
if(root == NULL) return result;
treeSt.push(root);
pathSt.push(to_string(root->val));
while(!treeSt.empty()){
TreeNode* node = treeSt.top(); treeSt.pop();
string path = pathSt.top(); pathSt.pop();
// 若为叶结点
if(!node->left && !node->right){
result.push_back(path);
}
// 不为叶结点
if(node->left){
treeSt.push(node->left);
pathSt.push(path + "->" + to_string(node->left->val));
}
if(node->right){
treeSt.push(node->right);
pathSt.push(path + "->" + to_string(node->right->val));
}
}
return result;
}
};
404.左叶子之和
题目链接:404. 左叶子之和
代码随想录的讲解今天来不及看了,先写了自己的版本,后面有时间补看下。
递归法
最简单的就是遍历各个结点,判断其是不是叶子结点,递归时比平常的遍历递归多一个孩子类型参数,说明是其父结点的左孩子还是右孩子。
class Solution {
public:
int sum = 0;
void traversal(TreeNode* cur, char flag){
if(cur == NULL) return;
if(!cur->left && !cur->right){ // 为叶结点
if(flag == 'l'){ // 为父节点的左孩子
sum += cur->val;
}
return;
}
if(cur->left) traversal(cur->left, 'l');
if(cur->right) traversal(cur->right, 'r');
}
int sumOfLeftLeaves(TreeNode* root) {
if(root == NULL) return sum;
traversal(root, ' ');
return sum;
}
};
迭代法
感觉可以用两个栈,一个用来存结点,一个用来存对应结点的类型(左孩子 or 右孩子)