😎蓝蓝计算机考研算法-day19二叉树深度

321 阅读1分钟

Day19 2023/03/19

难度:简单

题目1

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点) 形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为1。
数据范围:节点的数量满足0sn≤100,节点上的值满足0<=val≤100
进阶:空间复杂度O*(1),时间复杂度O*(n)

示例

输入:1 2 4 # # 5 7 # # # 3 # # 
输出:4

运行实例

image.png

思路


计算二叉树的深度属于二叉树的基本操作,一般使用基于DFS(深度优先算法)来计算二叉树深度!

关键点


  • 这里递归加1,可以理解为递归计算的是路径上的边,而深度计算的是 边 上的节点,所以要加1。
  • 创建二叉树时,本题采用的是先序遍历的序列(根左右)来创建的。

算法实现


c++代码实现-计算二叉树深度

#include <iostream>
#include <string>
using namespace std;

// 定义二叉树节点
typedef struct BiTNode {
  string data;              // 数据域
  BiTNode *left, *right; // 左右节点
  BiTNode(string val) : data(val), left(nullptr), right(nullptr){};
} BiTNode, *BiTree;

// 创建二叉树 (采用先序遍历的方式)
void CreateBTree(BiTree &T) {
    string val;  // 节点数据
    cin >> val;
    if (val == "#") T = nullptr; // val等于#代表该节点不存在
    else {
        T = new BiTNode(val);    // 申请新节点
        CreateBTree(T->left);
        CreateBTree(T->right);
    }
}

// 计算二叉树深度 (属于基操)
int TreeDepth (BiTree T) {
    if (!T) return 0;
    int LDepth = TreeDepth(T->left);
    int RDepth = TreeDepth(T->right);
    return LDepth > RDepth ? LDepth + 1 : RDepth + 1;
}

int main() {
   BiTree T;
   CreateBTree(T);  // 创建二叉树
   int deep = TreeDepth(T);  // 计算二叉树深度
   cout << "深度为:" << deep;
}

c++代码实现

  • 时间复杂度 O(n)O(n)--- 递归访问二叉树所有节点 ,其中n为节点总数
  • 空间复杂度 O(n)O(n)--- 最坏情况下二叉树呈现链状,递归栈深度等于二叉树节点数n

总结

  • 二叉树这种数据结构,它的许多基本操作都是基于递归实现的(😋),例如:先,中,后遍历、计算带权路径长度、二叉树深度、判断是否为平衡二叉树等等。
  • 本题的进阶要求空间复杂度O*(1),时间复杂度O*(n),这种实现方式肯定是非递归的,大家在掌握常规的递归的实现方式后可以尝试一下用非递归的方式实现以下!!!(😎)