详解二叉树,计算二叉树的深度

3,864 阅读3分钟

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

背景

学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。

问题

二叉树的深度

计算二叉树的深度

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

例如:

给定二叉树[3,9,20,null,null,15,7]

image.png

必备概念

树:不包含回路的连通的无向图(树是一种简单的非线性结构)

树有着不包含回路这个特点,所以树就有很多特性:

  1. 一棵树中任意两个节点有且仅有唯一的一条路径连通。
  2. 一棵树如果有N个节点,那它一定恰好有n-1条边。
  3. 在一棵树中加一条边将会构成一条回路。
  4. 树中有且仅有一个没有前驱的节点称为根节点。

image.png

二叉树

二叉树是一种非线性结构,二叉树是递归定义的,其结点有左右子树之分

特点:

1、每个结点最多有两颗子树

2、左子树和右子树是有顺序的,次序不能颠倒

3、即使某结点只有一个子树,也要区分左右子树

4、二叉树可为空,空的二叉树没有结点,非空二叉树有且仅有一个根节点

二叉树中有两种特殊的二叉树:满二叉树(每个节点左右两个节点都完整)、完全二叉树(除最后一层节点,其余的节点都达到最大值,最有一层节点只缺少右边的若干节点)

满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

image.png

二叉树的遍历(前序/中序/后序遍历)

前序遍历:首先访问根节点,然后遍历左子树,最后是右子树。(根->左->右)

中序遍历:首先遍历左子树,然后访问根节点,最后是右子树。(左->根->右)

后序遍历:首先遍历左子树,然后遍历右子树,最后是根节点。(左->右->根)

树的遍历总体分为两类

  • 深度优先遍历(DFS):先序遍历,中序遍历,后序遍历
  • 广度优先遍历(BFS):层序遍历(按层遍历)

解析

我们了解的上述的遍历方式后,再分析这道题,求二叉树的深度?

1.求出左边树的最大深度

2.求出右边树的最大深度

3.最后加上根节点

这种思想正好是后序遍历。

image.png

代码:

    /**
     * Definition for a binary tree node.
     * function TreeNode(val) {
     *     this.val = val;
     *     this.left = this.right = null;
     * }
     */
    /**
     * @param {TreeNode} root
     * @return {number}
     */
    var maxDepth = function(root) {
         if(root==null) return 0;
        //递归,先算左边,左边递归,每一个层级+1
        //递归右边,每一层级+1
        //求最大深度,最后加根节点
        return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
    };

验证:

image.png

结语

一步一步慢慢来,踏踏实实把活干!