二叉树的深度_二叉树的深度

d6150515e9cd344ae4f5b0bedbcc9fe5.png

题目描述

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

dabce425bfe4193be9cadbbec3ffa5df.png

数据结构 TreeNode 的定义:

牛客编程题高级数据结构格式说明_牛客博客​blog.nowcoder.net
9bd484418a160f60905835c0cfa38892.png

解题思路及代码

方法一:分治法

分治法的基本思想是:求一个规模为 n 的问题时,我们先求左边规模大约为 n/2 的问题,然后再求右边规模大约为 n/2 的问题,最后合并左边,右边的解得到最终解。

所以对于求二叉树深度这个具体的问题而言,解决思路就是分别求出左右子树的深度,然后取较大值加 1 就是最终解。(一个递归的过程)

步骤为:

  1. TreeDepth(TreeNode* pRoot)->int
  2. 先求 TreeDepth(pRoot->left) ->lval
  3. 再求TreeDepth(pRoot->right) ->rval
  4. return max(lval, rval) + 1

代码为:

class Solution {
public:
    int TreeDepth(TreeNode* pRoot)
    {
        if (!pRoot) return 0;
        int lval = TreeDepth(pRoot->left);
        int rval = TreeDepth(pRoot->right);
        return max(lval, rval) + 1;

    }
};

Java 版:

public int TreeDepth(TreeNode root) {
    return root == null ? 0 : 1 + Math.max(TreeDepth(root.left), TreeDepth(root.right));
}

时间复杂度:O(n)

空间复杂度:O(n),当退化到链表时

方法二:层次遍历

使用队列来完成层次遍历。

步骤:

  1. 初始化:一个队列queue q, 将root节点入队列q
  2. 如果队列不空,做如下操作:
  3. 弹出队列头,保存为node,将node的左右非空孩子加入队列
  4. 做2,3步骤,知道队列为空

如果不需要确定当前遍历到哪一层,模板如下:

void bfs() {
    vis[] = 0;
    queue<int> pq(start_val);

    while (!pq.empty()) {
        int cur = pq.front(); pq.pop();
        for (遍历cur所有的相邻节点nex) {
            if (nex节点有效 && vis[nex]==0){
                vis[nex] = 1;
                pq.push(nex)
            }
        }
    }
}

如果需要确定遍历到哪一层,模板如下

添加一个变量 level,然后每一层遍历完 level 加 1。

void bfs() {
    int level = 0;
    vis[] = 0; // or set
    queue<int> pq(original_val);
    while (!pq.empty()) {
        int sz = pq.size();

        while (sz--) {
                int cur = pq.front(); pq.pop();
            for (遍历cur所有的相邻节点nex) {
                if (nex节点有效 && vis[nex] == 0) {
                    vis[nex] = 1;
                    pq.push(nex)
                }
            } // end for
        } // end inner while
        level++;

    } // end outer while
}

所以本题的代码为:

class Solution {
public:
    int TreeDepth(TreeNode* pRoot)
    {
        if (!pRoot) return 0;
        queue<TreeNode*> q;
        q.push(pRoot);
        int leve1 = 0;
        while (!q.empty()) {
            int sz = q.size();
            while (sz--) {
                auto node = q.front(); q.pop();
                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);
            }
            leve1 += 1;
        }
        return level;

    }
};

时间复杂度:O(n),二叉树的每个节点遍历一次

空间复杂度:O(n),最差情况下,树平衡时,队列最多存储n/2个节点。


解析参考来自:

二叉树的深度_牛客网​www.nowcoder.com
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值