题目:最小树深
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.
题意:
给定一棵二叉树,找到最小树深。最小树深是沿着从根节点到最短叶子节点的路径上的节点数量。
思路一:
采用递归实现。递归二叉树中的每一个节点,递归从递归到的叶子节点开始计算加1之后的回溯值,如果不是叶子节点,则将返回值设为INT_MAX,利用min函数裁减掉非叶子节点所产生的节点回溯值。
代码:C++版:12ms
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int minDepth(TreeNode* root) { return minDepth(root, false); } private: static int minDepth(const TreeNode *root, bool hasbrother) { if (!root) return hasbrother ? INT_MAX : 0; //筛选出叶子节点 return 1 + min(minDepth(root->left, root->right != NULL), minDepth(root->right, root->left != NULL)); } };
思路二:
迭代实现。借助栈辅助实现二叉树的迭代遍历,每次对节点进行判断,如果是叶子节点,则更新一下最终返回值,否则继续将迭代到的节点的左右子节点分别入栈,直到完成对整个二叉树的迭代遍历。
代码:C++版:12ms
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int minDepth(TreeNode* root) { if (root == nullptr) return 0; int res = INT_MAX; stack<pair<TreeNode*, int>> stk; stk.push(make_pair(root, 1)); while (!stk.empty()) { auto node = stk.top().first; auto depth = stk.top().second; stk.pop(); if (node->left == nullptr && node->right == nullptr) res = min(res, depth); //如果是叶子节点,更新一下最小结果 if (node->left && res > depth) //将左子树入栈 stk.push(make_pair(node->left, depth + 1)); if (node->right && res > depth) //将右子树入栈 stk.push(make_pair(node->right, depth + 1)); } return res; } };