题目描述

描述

求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。

示例

输入: {1,2,3,4,5}

返回值: 2

思路

最开始也想拿深度优先做来着,就是递归遍历到所有的叶子节点,然后记录最小值。但是考虑到递归太麻烦,而且不论树的结构如何,都要遍历所有的节点,就算配合一定的剪枝算法,也并不一定能够保证剪枝的效果。

因此考虑使用广度优先的算法,反正是寻找最小值,也就是说只要我从上到下在树的某一层寻找到了叶子节点,那么它必然是最小深度。

而且既然数据结构中给了一个val变量,就直接使用这个变量存储当前节点的深度就可以了。

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int run(TreeNode* root) {
        if(root==NULL)										//处理空树情况
            return 0;
        queue<TreeNode> q;
        root->val = 1;
        q.push(*root);
        while(true)
        {
            TreeNode node = q.front();
            if(node.left == NULL && node.right == NULL)
            {
                return node.val;							//val的值即为节点深度。
            }
            else
            {
                if(node.left!=NULL)
                {
                    node.left->val = node.val+1;			//记录节点深度
                    q.push(*node.left);
                }
                if(node.right!=NULL)
                {
                    node.right->val = node.val+1;
                    q.push(*node.right);
                }
            }
            q.pop();
        }
    }
};