题目描述
原题链接:111. 二叉树的最小深度
解题思路
1、迭代法:层序遍历BFS
最小深度的特点是第一次遍历到结点的左右指针为NULL,此时该路径为最短路径。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int minDepth(TreeNode* root) {
if(!root) return 0;
int res = 0;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()) {
int n = que.size();
res++;
while(n--) {
TreeNode* node = que.front();
que.pop();
if(!node->left && !node->right) return res;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return 0;
}
};
2、递归:先序遍历DFS
DFS其实并不太适于去处理最短路径一类问题,因为他需要将所有的情况都遍历完,才能确定最短的情况。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int depth = 0, res = INT32_MAX;
void traversal(TreeNode* root) {
if(!root) return ;
// 该层结点不为空节点,层数加一
depth++;
// 当遍历到叶子接待时,找最小深度
if(!root->left && !root->right) res = min(res, depth);
if(root->left) traversal(root->left);
if(root->right) traversal(root->right);
// 该层遍历完,返回之前位置,去另一边查询
depth--;
};
int minDepth(TreeNode* root) {
if(!root) return 0;
traversal(root);
return res;
}
};
3、递归:后序遍历BFS(分解问题思路)
将求最小深度,转化为求每一个左右子树的最小深度。自底向上,每次都得到左右子树最小深度时,最后得到的总的最小深度,一定为这个树的最小深度。
在代码实现时,注意和 104. 二叉树的最大深度(层次遍历+DFS+子问题分解)
的区别。104求得是最大深度,因此需要遍历完所有情况,找max
,对于遇到空节点直接返回为0即可。而对本题,由于使用的是min
因此规定只有遇到,叶子结点才返回最小深度,对于中间结点某侧会走到空结点的不进行遍历,从而导致误判。
注意:后序遍历实际上求得是最小高度。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int minDepth(TreeNode* root) {
// 若输入的是为NULL,直接返回0
if(root == NULL) return 0;
// 只有当遇到叶子结点时,才返回结果。若空结点时就返回的话,因为记录的是最小值,会导致误判
// 一侧为空时,去另一侧遍历
else if(root->right == NULL) return minDepth(root->left) + 1; // 左
else if(root->left == NULL) return minDepth(root->right) + 1; // 右
// 左右都不为空,则按正常左右中顺序遍历
int leftlength = minDepth(root->left); // 左
int rightlength = minDepth(root->right); // 右
return min(leftlength, rightlength) + 1; // 中
}
};
参考文章:111.二叉树的最小深度