leetcode 104. Maximum Depth of Binary Tree (求二叉树的最大深度,DFS,BFS)

题目要求

给定一个二叉树,求其最大深度。
最大深度:从根结点到叶子结点包含的节点的最大个数。
注意: 叶子结点说的是一个没有孩子的节点。

输入示例

Example:

输入一个二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
return its depth = 3.

解题思路

1、用深度优先遍历(DFS)
根据深度优先遍历的思想,我们可以先遍历到根节点左右子树的叶子结点,然后比较左右子树的最大深度,取最大的即可。需要注意的是,最后答案不要忘记加上根节点(代码中的+1操作),DFS的思想和实现都非常简单,直接看一下代码:

DFS 主要代码 c++

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

2、用广度优先遍历(BFS)
主要说说BFS的实现,实际上二叉树的最大深度就是树的层数,依靠这个关系我们可以借助队列进行层序遍历,最后的层数就是题目中要求的最大深度。

具体实现的时候,我们对每一层进行如下操作:将根结点放入队列,然后对队列里的每个元素执行------弹出队列首元素---------放入其对应的孩子节点(如果有的话,为了对下一层进行遍历)---------每执行一层,层数+1。

BFS 主要代码 c++

class Solution {
public:
		int maxDepth(TreeNode *root)
		{
		    if(root == NULL)
		        return 0;
		    
		    int res = 0; // 标记高度最大值
		    queue<TreeNode *> q;
		    q.push(root);
		    while(!q.empty())// 迭代操作标志
		    {
		        ++ res; // 每执行一层,深度+1。
		        for(int i = 0, n = q.size(); i < n; ++ i) //对队列里的每个元素进行操作。
		        {
		            TreeNode *p = q.front(); // 具体的队列操作是
		            q.pop();                // 弹出根节点,然后放入孩子节点(如果有)
		            
		            if(p -> left != NULL)
		                q.push(p -> left);
		            if(p -> right != NULL)
		                q.push(p -> right);
		        }
		    }
		    return res;
	}
};

python 双边队列解法

class Solution(object):
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        dp = collections.deque([(root,1),])
        while dp:
            cur, count = dp.popleft()
            if cur.left:
                dp.append((cur.left,count+1))
            if cur.right:
                dp.append((cur.right, count+1))
        return count

总结

对于求树的深度的问题,一般情况下,我们可以用递归,非递归两种方法来求解,大都数情况下,结合DFS的思想可以很简单的写出递归的方案,但是合理利用队列进行层序遍历,也是一种十分高效的手段,并且代码也并不是很难理解,建议两个方法互相结合着看,推荐掌握BFS 非递归的方法,毕竟多熟悉熟悉队列的操作也没坏处~

最后不要忘记树是空的情况哦!!!。

原题链接:https://leetcode.com/problems/maximum-depth-of-binary-tree/

你可能感兴趣的:(leetcode题解,leetcode,二叉树深度,bfs,dfs)