二叉树最大深度两种解法

92 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

题目描述

给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。

//示例
       3
      / \
     9  20
     /  \
    15   7
//输出  3


/**
 * 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) {}
 * };
 */

(一)递归实现

二叉树遍历,通常用递归。递归方法,只需在乎两点:1.输入的是什么 2. 输出的是什么 例如在此题中,输入的是根节点,输出最大深度,因此,只需依次计算左子树的最大深度和右子树的最大深度。整棵树的最大深度=max(左子树最大深度+1,右子树最大深度+1),+1是加上根节点所占的那层

代码实现

int maxDepth(TreeNode^ root){
//依次往下遍历,当遍历到叶子节点的子节点时,函数返回空,由于返回时进行+1,所以以叶子节点为根节点的子树的最大深度是1,此时叶子节点作为子树,最大深度是1,则对于叶子节点的父亲节点,最大深度=1+1=2,依次向上累加,直到到达根节点的子树
    if(root==null) return 0;
    else return max(maxDepth(root->right)+1,maxDepth(root->left)+1);
}

(二)广度优先遍历(层序遍历)

使用队列来保存节点,就一层一层遍历,每次遍历完一层的节点,深度+1就好了。遍历到最后一层的深度就是最大深度。

代码实现

class Solution {
public:
    int maxDepth(TreeNode* root) {
    //便于广度优先遍历,队列中存储的是一层的节点数
    queue<TreeNode*> list;
    //记录深度
    int depth=0;
    //当根节点是空时
    if(root==nullptr) return 0;
    //当根节点不为空时,先将根节点入队列
    list.push(root);
    //当队列不为空时
    while(!list.empty()){
        //深度+1,加的是根节点的那一层
        depth++;
        //获取队列中节点的数目
        int num=list.size();
        //循环结束,代表一层访问结束
        for(int i=0;i<num;i++){
            //定义一个指针指向队列的第一个节点
            TreeNode*q=list.front();
            //队列采用先出队列,再访问策略
            //出队
            list.pop();
            //访问,当当前节点的左节点不为空时,将左节点入队
            if(q->left)  list.push(q->left);
            if(q->right)  list.push(q->right);

        }
    }
    return depth;         

    }
};