卡哥建议:迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。
110.平衡二叉树 (优先掌握递归)
卡哥建议:再一次涉及到,什么是高度,什么是深度,可以巩固一下。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html
做题思路:
平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
百度上高度定义:二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数(高度从0开始)。
力扣上高度定义:二叉树节点的高度:指从该节点到叶子节点的节点数(高度从1开始)。我们暂时以leetcode为准(毕竟要在这上面刷题)。
比较高度,必然是要后序遍历。
遍历出一个节点的左子树高度和右子树高度后,再比较高度差的绝对值不超过1,如果不超过1,高度就为 1 + max(左子树高度, 右子树高度)。然后代码做了一些改变。
本题后序遍历的递归法代码:
1 // 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1 2 int getHeight(TreeNode* node) { 3 if (node == NULL) { 4 return 0; 5 } 6 int leftHeight = getHeight(node->left); //左 7 if (leftHeight == -1) return -1; 8 int rightHeight = getHeight(node->right); //右 9 if (rightHeight == -1) return -1; 10 return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight); //中,返回给根节点的高度 11 } 12 bool isBalanced(TreeNode* root) { 13 return getHeight(root) == -1 ? false : true; 14 }
257. 二叉树的所有路径 (优先掌握递归)
卡哥建议:这是大家第一次接触到回溯的过程, 我在视频里重点讲解了 本题为什么要有回溯,已经回溯的过程。 如果对回溯 似懂非懂,没关系, 可以先有个印象。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html
做题思路:
从根节点一直遍历到左子树的叶子节点,再回溯,从根节点到右子树的叶子节点。所以先使用递归的方式,来做前序遍历。
看卡哥的是视频和文章吧。
本题代码:
1 class Solution { 2 private: 3 4 void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) { 5 path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中 6 // 这才到了叶子节点 7 if (cur->left == NULL && cur->right == NULL) { 8 string sPath; 9 for (int i = 0; i < path.size() - 1; i++) { 10 sPath += to_string(path[i]); 11 sPath += "->"; 12 } 13 sPath += to_string(path[path.size() - 1]); 14 result.push_back(sPath); 15 return; 16 } 17 if (cur->left) { // 左 18 traversal(cur->left, path, result); 19 path.pop_back(); // 回溯,每次递归后有一个回溯 20 } 21 if (cur->right) { // 右 22 traversal(cur->right, path, result); 23 path.pop_back(); // 回溯 24 } 25 } 26 27 public: 28 vector<string> binaryTreePaths(TreeNode* root) { 29 vector<string> result; 30 vector<int> path; //在创建二叉树的时候会有输入,路径也就有了 31 if (root == NULL) return result; 32 traversal(root, path, result); 33 return result; 34 } 35 };
404.左叶子之和 (优先掌握递归)
卡哥建议:其实本题有点文字游戏,搞清楚什么是左叶子,剩下的就是二叉树的基本操作。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html
做题思路:
左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。
判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子。判断代码如下:
if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
左叶子节点处理逻辑
}
递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
本题代码:
1 1 int sumOfLeftLeaves(TreeNode* root) { 2 2 if (root == NULL) return 0; 3 3 if (root->left == NULL && root->right== NULL) return 0; 4 4 5 5 int leftValue = sumOfLeftLeaves(root->left); // 左 6 6 if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况 7 7 leftValue = root->left->val; 8 8 } 9 9 int rightValue = sumOfLeftLeaves(root->right); // 右 10 10 11 11 int sum = leftValue + rightValue; // 中 12 12 return sum; 13 13 }
标签:随想录,叶子,404,二叉树,path,root,节点,left From: https://www.cnblogs.com/romantichuaner/p/17625937.html