104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
关键词: 递归、回溯
递归三件套:
- 参数设置与返回值设置
- 需要遍历整颗树,期间会改变deepth的值,所以不需要返回值
- 参数只需要TreeNode*和一个代表访问节点层的树的高度,用来与全局deepth作比较来确定二叉树最深的深度
- 终止条件
- 终止条件即该节点为叶子节点的时候就可以返回了
- 本层逻辑
- 判断是否有左右孩子,如果有则深入访问,注意回溯cur_deepth
完整代码:
class Solution { public: int deepth = 0; void backTracking(TreeNode *cur, int cur_deepth){ deepth = deepth < cur_deepth ? cur_deepth : deepth; // 如果本层深度比历史记录深度大则替换 if(!cur->left && !cur->right) return; if(cur->left){ cur_deepth++; backTracking(cur->left,cur_deepth); cur_deepth--; // 回溯 } if(cur->right){ cur_deepth++; backTracking(cur->right,cur_deepth); cur_deepth--; //回溯 } } int maxDepth(TreeNode* root) { if(root == nullptr) return deepth; deepth++; backTracking(root, deepth); return deepth; } };
改动
上面的代码只稍作改动就可以作为二叉树的最小深度的题解
- 将deepth的初始值设置为最大数INT_MAX
- 改变三元运算符中的条件
- 且只在访问到叶子节点时才进行比较
完整代码
class Solution { public: int deepth; void backTracking(TreeNode *cur, int cur_deepth){ if(!cur->left && !cur->right) { deepth = deepth > cur_deepth ? cur_deepth : deepth; // 如果本层深度比历史记录深度大则替换 return ; } if(cur->left){ cur_deepth++; backTracking(cur->left,cur_deepth); cur_deepth--; // 回溯 } if(cur->right){ cur_deepth++; backTracking(cur->right,cur_deepth); cur_deepth--; //回溯 } } int minDepth(TreeNode* root) { deepth = 0; if(!root) return deepth; deepth = INT_MAX; backTracking(root, 1); return deepth; } };