剑指offer(C++)-JZ55:二叉树的深度(数据结构-树)

简介: 剑指offer(C++)-JZ55:二叉树的深度(数据结构-树)

题目描述:

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


数据范围:节点的数量满足 0≤n≤100 ,节点上的值满足0≤val≤100


进阶:空间复杂度 O(1) ,时间复杂度 O(n)


假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:

 

示例:

输入:

{1,2,3,4,5,#,6,#,#,7}


返回值:

4

解题思路:

本题考察数据结构树的使用。有两个解法。


  1. 递归。分治思想,分别统计左右两个子树的深度,取最大值加一即可;从根结点开始,一级级往下统计,再返回上去就得到结果了。
  2. 队列。队列的特点是先进先出,我们想将根结点扔进去,用size读取当前队列的长度,然后进行size次的弹出,同时每次弹出后再往队列中塞入被弹出结点的左右树;如果队列中持续有结点,说明没到底部;若队列为空,说明当前的level就是最深的深度了,再往下没有结点了。

测试代码:

解法一:递归

/*
struct TreeNode {
  int val;
  struct TreeNode *left;
  struct TreeNode *right;
  TreeNode(int x) :
      val(x), left(NULL), right(NULL) {
  }
};*/
class Solution {
public:
    int TreeDepth(TreeNode* pRoot) {
        if(!pRoot)
            return 0;
        int leftnum=TreeDepth(pRoot->left);
        int rightnum=TreeDepth(pRoot->right);
        return max(leftnum,rightnum)+1;
    }
};

解法二:队列

/*
struct TreeNode {
  int val;
  struct TreeNode *left;
  struct TreeNode *right;
  TreeNode(int x) :
      val(x), left(NULL), right(NULL) {
  }
};*/
class Solution {
public:
    int TreeDepth(TreeNode* pRoot) {
        if(!pRoot)
            return 0;
        queue<TreeNode*> q;
        q.push(pRoot);
        int level=0;
        // 队列先进先出
        while(!q.empty())
        {
            int size=q.size();
            // 将当前级的结点遍历一遍
            while(size--)
            {
                // 定位到头部,再弹出
                auto f=q.front();
                q.pop();
                // 如果左右子树都为空,那么q就空了,也就终止循环了
                if(f->left)
                    q.push(f->left);
                if(f->right)
                    q.push(f->right);
            }
            level++;
        }
        return level;
    }
};


相关文章
|
1月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
107 8
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
26 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
28 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
2月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
28 1
|
2月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
26 1
|
2月前
|
存储
【数据结构】二叉树链式结构——感受递归的暴力美学
【数据结构】二叉树链式结构——感受递归的暴力美学
|
2月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆
|
2月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
30 0
|
2月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
2月前
|
存储
【数据结构】二叉树零基础无压力上手,超详解
【数据结构】二叉树零基础无压力上手,超详解
31 0