最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 采用DFS深度优先搜索,参数为当前节点及其对应深度,在每一层搜索中,设置变量ans为一个较大值,当遍历到叶子节点时,更新ans,并传回上一层,在向上传递过程中,比较左右子树传回的深度,并更新保持最小值。
class Solution { public: int findMinDepth(TreeNode* root,int depth){ int ans = 1e9; if(root->left != NULL) ans = min(findMinDepth(root->left,depth + 1),ans); if(root->right != NULL) ans = min(findMinDepth(root->right,depth + 1),ans); if(root->left == NULL && root->right == NULL) ans = min(ans,depth); return ans; } int minDepth(TreeNode* root) { if(root == NULL) return 0; return findMinDepth(root,1); } };二叉树的深度(最大深度)为根节点到最远叶子节点的最长路径上的节点数。 采用DFS深度优先搜索,参数为当前节点及其对应深度,在每一层搜索中,设置变量ans等于当前深度值,当遍历到叶子节点时,直接返回ans(即该叶子节点对应深度),并传回上一层,在向上传递过程中,比较左右子树传回的深度,并更新保持最大值。
class Solution { public: int dfs(TreeNode* root, int depth) { int ans = depth; if(root -> left != NULL) ans = max(ans, dfs(root -> left, depth + 1)); if(root -> right != NULL) ans = max(ans, dfs(root -> right, depth + 1)); return ans; } int maxDepth(TreeNode* root) { int ans = 0; if(root == NULL) return ans; ans = dfs(root, 1); return ans; } };题目描述: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 返回true或者false。 采用DFS深度优先遍历,参数为当前节点, 目标路径和以及从根节点到当前节点的路径和。当遍历到叶子节点时,比较当前路径和是否等于目标路径和,如果等于,返回true,并返回上一层。每一层搜索中,默认变量ans为false,ans与左右子树的返回值进行或等运算,如果有一条路径的返回值为true,则根节点的返回值为true。 |=: 或等运算,类比于+= ,-=运算。
class Solution { public: bool dfs(TreeNode* root, int pathSum, int sum) { bool ans = false; if(root -> left != NULL) ans |= dfs(root -> left, pathSum + root -> val, sum); if(root -> right != NULL) ans |= dfs(root -> right, pathSum + root -> val, sum); if(root -> left == NULL && root -> right == NULL && pathSum + root -> val == sum) ans = true; return ans; } bool hasPathSum(TreeNode* root, int sum) { if(root == NULL) return false; return dfs(root, 0, sum); } };题目描述: 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。返回二维数组。 采用DFS深度优先搜索,参数包括当前节点,目标路径总和,答案路径数组以及当前路径数组。当遍历到叶子结点且该路径总和等于目标路径总和时,将当前路径数组push到答案数组,每遍历完一个节点及其左右子树后,在当前路径数组中pop掉当前节点并返回上一层继续遍历。
class Solution { public: void dfs(TreeNode* root, int sum, vector<vector<int>>& ans, vector<int>& tmp) { tmp.push_back(root -> val); if(root -> left != NULL) dfs(root -> left, sum - root -> val, ans, tmp); if(root -> right != NULL) dfs(root -> right, sum - root -> val, ans, tmp); if(root -> left == NULL && root -> right == NULL && sum - (root -> val) == 0) ans.push_back(tmp); tmp.pop_back(); return ; } vector<vector<int>> pathSum(TreeNode* root, int sum) { vector<vector<int>> ans; if(root == NULL) return ans; vector<int> tmp; dfs(root, sum, ans, tmp); return ans; } };题目描述: 找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。返回值为路径总数。 DFS,保存每个节点到根节点的路径总和,存入数组path_sum中,在向下dfs的过程中,遍历当前path_sum中的每一个值,和当前节点对应的路径和相减,符合给定数值,则ans+1。遍历过节点(以及节点的左右子树)后,将当前节点对应的路径和pop出数组,并返回上一层搜索过程。
class Solution { public: void dfs(TreeNode* root, int node_sum, vector<int>& path_sum, int& ans, int sum) { node_sum += root -> val; for(int i = 0; i < path_sum.size(); i++) { if(node_sum - path_sum[i] == sum) ans++; } path_sum.push_back(node_sum); if(root -> left != NULL) dfs(root -> left, node_sum, path_sum, ans, sum); if(root -> right != NULL) dfs(root -> right, node_sum, path_sum, ans, sum); path_sum.pop_back(); return ; } int pathSum(TreeNode* root, int sum) { int ans = 0; if(root == NULL) return ans; vector<int> path_sum; path_sum.push_back(0); dfs(root, 0, path_sum, ans, sum); return ans; } };题目描述: 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。这条路径可以经过也可以不经过根节点。两个节点之间的路径长度由它们之间的边数表示。 DFS,每层遍历返回左子树和右子树中具有相同值的最大长度,如果当前节点与其左节点的值不相等,left_dep清零,同理right_dep。如果相等,则在返回值的基础上加一。遍历每个节点时,更新ans值ans = max(ans, left_dep + right_dep);。
class Solution { public: int dfs(TreeNode* root, int &ans) { int left_dep = 0, right_dep = 0; if(root -> left != NULL) { left_dep = dfs(root->left, ans); if(root -> val == root ->left -> val) left_dep += 1; else left_dep = 0; } if(root -> right != NULL) { right_dep = dfs(root->right, ans); if(root -> val == root ->right -> val) right_dep += 1; else right_dep = 0; } ans = max(ans, left_dep + right_dep); return max(left_dep, right_dep); } int longestUnivaluePath(TreeNode* root) { int ans = 0; if(root == NULL) return ans; dfs(root, ans); return ans; } };