目录
110.平衡二叉树
平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:true
思路:
1、可以定义一个函数来计算子树的长度,在主函数中引用该函数计算左右子树是否符合该条件。
int getHeight(TreeNode* node)
{
if(node==0)return 0;
int leftHeight = getHeight(node->left);
int rightHeight = getHeight(node->right);
return leftHeight>rightHeight?leftHeight+1:rightHeight+1;
}
bool isBalanced(TreeNode* root)
{
if(root==nullptr)return true;
int a = getHeight(root->left)-getHeight(root->right);
if(abs(a)>1)return false;
return isBalanced(root->left)&&isBalanced(root->right);
}
2、定义一个函数判断子树是否符合该条件。两个思路都是递归
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;
return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
};
迭代法过于繁琐,没有仔细了解。
257. 二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
思路:
迭代法:
与之前所写无什么不同,不过是要加入一个栈来记录路径经过的节点。
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
stack<TreeNode*>tree;
stack<string>str;
vector<string>result;
if(root ==NULL) return result;
tree.push(root);
str.push(to_string(root->val));
while(!tree.empty()){
TreeNode* node=tree.top(); tree.pop();
string pa=str.top(); str.pop();
if(node->left ==NULL && node->right ==NULL){
result.push_back(pa);
}
if(node->left) {
tree.push(node->left);
str.push(pa + "->" +to_string(node->left->val));
}
if(node->right){
tree.push(node->right);
str.push(pa + "->" + to_string(node->right->val));
}
}
return result;
}
};
递归法:
主要注意回溯算法在本题中的应用,以及题目要求的返回数组为字符型,因此要转换字符类型。
class Solution {
private:
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中
// 这才到了叶子节点
if (cur->left == NULL && cur->right == NULL) {
string sPath;
for (int i = 0; i < path.size() - 1; i++) {
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(); // 回溯
}
}
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL) return result;
traversal(root, path, result);
return result;
}
};
看起来思路清晰明了,但实际上感觉忽略了某些东西,所以感觉没懂。希望在后面专题讲回溯算法的时候再回头看。
404.左叶子之和
计算给定二叉树的所有左叶子之和。
示例:
思路:
求左子树之和,需要找到左叶子,左叶子的寻找条件是上一个节点的左节点不为空,且左节点的下一层无节点,为空,记录这种节点,并相加。
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == NULL) return 0;
int leftlen=sumOfLeftLeaves(root->left);
if(root->left !=NULL &&root->left->left==NULL&&root->left->right == NULL)
{
leftlen=root->left->val;
}
int rightlen=sumOfLeftLeaves(root->right);
int sum =leftlen + rightlen;
return sum;
}
};
总结:二叉树的内容看题解的时候不难,自己写不太可以。