当前位置: 代码迷 >> 综合 >> LeetCode刷题笔记(树的最小深度):minimum-depth-of-binary-tree
  详细解决方案

LeetCode刷题笔记(树的最小深度):minimum-depth-of-binary-tree

热度:25   发布时间:2023-12-15 19:35:50.0

题目描述:

Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node。

给定一棵二叉树,找到它的最小深度。最小深度是沿着从根节点到最近叶节点的最短路径的节点数量。

 

深度优先(需要遍历每一个结点):

思路:

  • 左右子树都为空,则返回0;
  • 左子树或右子树为空,返回非空子树深度加一;(加一,是因为要加根节点)
  • 左右子树都不为空,则返回左右子树深度较小的一边并且加一;

 

方法一:

class Solution {
public:int run(TreeNode *root) {if(root == NULL){return 0;}if(root->left == NULL)//左子树为空的情况{return run(root->right) + 1;}if(root->right == NULL)//右子树为空的情况{return run(root->left) + 1;}int left = run(root->left);//左右子树都存在的情况int right = run(root->right);return (left < right) ? (left +1) : (right +1);}
};

方法二:

class Solution {
public:int run(TreeNode *root) {if(root == NULL){return 0;}int left = run(root->left);int right = run(root->right);return (left == 0 || right == 0) ? right+left+1 : min(left,right)+1;}
};

 

层次遍历(找到第一个叶子结点):

思路:使用结点指针now、last;now指向当前结点,判断是否有左右孩子;last指向每一层的最后一个结点;当now等于last时,表示一层编译完,这个时候树地深度加一;当遇到第一个没有左右孩子的结点时,就说明这个叶子结点是到根节点的最短路径的结点数量;

class Solution {
public:int run(TreeNode *root) {if(root == NULL){return 0;}queue<TreeNode *> q;TreeNode* now;//指向当前结点TreeNode* last;//指向每一层的最后一个结点now = last = root;int size = -1;int depth = 1;//深度q.push(root);size = q.size();while(q.size())//队列中有结点{now = q.front();q.pop();size = q.size();if(now->left)//如果存在左子树{q.push(now->left);}if(now->right)//如果存在右子树{q.push(now->right);}if(q.size() - size == 0)//左右子树都不存在,找到叶子结点{break;}if(now == last)//表示这一层查找完毕{depth++;last = q.back();//重置last}}return depth;}
};

 

  相关解决方案