1、110平衡二叉树
给定一个二叉树,判断它是否是平衡二叉树。
平衡二叉树:指该树所有节点的左右子树的高度相差不超过1
。
我的思路:这道题和最大深度不同,最大深度只需要递归返回最大深度,但是这里有两个信息需要返回,一个是返回节点高度来供父节点处理,二是当前节点不满足平衡就返回false。我把高度作为参数,返回值为是否平衡。
代码随想录:看了代码随想录,由于高度始终为正,所以可以把-1作为否平衡,>0作为平衡。这样就只需要一个返回值,也就是当前节点的高度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public: bool traverse(TreeNode* root,int &hig){ if(root == nullptr){ hig = 0; return true; } int higl = 0,higr = 0; if(traverse(root->left,higl) == false || traverse(root->right,higr) == false){ return false; } if(std::abs(higl-higr)>1)return false; hig = 1+std::max(higl,higr); return true; } bool isBalanced(TreeNode* root) { int hig = 0; return traverse(root,hig); } };
class Solution { public: 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; } };
|
2、257二叉树的所有路径
给你一个二叉树的根节点 root ,按任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点是指没有子节点的节点。
我的思路: 我觉得这题的关键在于路径是从root指向叶子节点,也就是从上到下,所以可以使用前序遍历。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: void traverse(TreeNode* root, vector<int> &path, vector<string>& res){ if(root == nullptr) return;
path.emplace_back(root->val); if(root->left == nullptr && root->right == nullptr){ string temp; for(int i = 0;i<path.size()-1;i++){ temp+=std::to_string(path[i])+"->"; } temp+=std::to_string(root->val); path.pop_back(); res.emplace_back(temp); return; } traverse(root->left,path,res); traverse(root->right,path,res); path.pop_back(); } vector<string> binaryTreePaths(TreeNode* root) { vector<int> path; vector<string> res; traverse(root,path,res); return res; } };
|
3、404左叶子之和
给定二叉树的根节点 root
,返回所有左叶子之和。
我的思路: 递归的第一要素就是找到截止条件,一般遍历判断当前节点是否为空指针即可,但是对于一些特殊情况,比如要求左叶子节点就必须找到父节点。
代码随想录递归三部曲:
- 确定递归函数的参数和返回值
- 确定终止条件
- 确定单层递归的逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class Solution { public: int traverse(TreeNode* root){ int le = 0,ri = 0; if(root->left != nullptr){ if(root->left->left == nullptr && root->left->right == nullptr){ le = root->left->val; }else{ le = traverse(root->left); } } if(root->right != nullptr){ ri = traverse(root->right); } return le+ri; } int sumOfLeftLeaves(TreeNode* root) { if(root == nullptr)return 0; return traverse(root); } };
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; } };
|
4、222完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树定义:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(从第 0 层开始),则该层包含 1~ 2h 个节点。
我的思路: 这道题第一眼看起来和求普通二叉树节点个数一样。选定返回值为当前节点以下的个数,则确定使用后序遍历。
代码随想录: 完全二叉树中大部分子树为满二叉树,对于满二叉树我们通过它的深度即可计算出节点个数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Solution { public: int countNodes(TreeNode* root) { if(root == nullptr)return 0; int le = countNodes(root->left); int ri = countNodes(root->right); return 1+le+ri; } };
class Solution { public: int countNodes(TreeNode* root) { if(root == nullptr)return 0;
TreeNode* left = root->left; int leftdep = 0; while(left!=nullptr){ left = left->left; leftdep++; } TreeNode* right = root->right; int rightdep = 0; while(right!=nullptr){ right = right->right; rightdep++; } if(leftdep == rightdep){ return (2 << leftdep) - 1; }
return 1 + countNodes(root->left)+countNodes(root->right); } };
|
代码随想录算法训练第十五天|110平衡二叉树|257二叉树的所有路径|404左叶子之和|222完全二叉树的节点个数