剑指offer JZ55 二叉树的深度

描述:

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

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

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

思路:

1.层次遍历

       设置一个辅助队列,分层统计,按照从上到下,从左到右的顺序,每次让每一层的所有节点都入队,队列里的元素个数为每一层的节点数,遍历完一层后,让记录层数的值+1,到最后到达最远的叶子节点后,返回层数记录值。

代码实现:

public class Solution {
    public int TreeDepth(TreeNode root) {
        if (root == null) return 0;

        Queue<TreeNode> queue = new LinkedList<>();
        int res = 0;
        queue.offer(root);

        while (!queue.isEmpty()){
            int n = queue.size();

            for (int i=0;i<n;i++){
                TreeNode node = queue.poll();
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
            res++;
        }
        return res;
    }
}

2.递归思路

       递归思路很好想,代码也很简单,只要一个问题可以分解成结构相同,规模更小的子问题,并且最终有递归退出条件,那就一般可以考虑递归,但是由于其时间复杂度,一般不推荐。

       在本题中,问题可以简化为,求当前根二叉树的深度就等于求其左右子树深度的最大值+1,而每颗子树,又可以将其看做一个根节点,迭代这个思路,将大问题划归成小问题,利用递归解决。

代码:

public class Solution {
    public int maxDepth (TreeNode root) {
        //空节点没有深度
        if(root == null) 
            return 0;
        //返回子树深度+1
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; 
    }
}

总结:

        此题属于简单题,但层次遍历是二叉树的基础算法,需要熟练掌握,而层次遍历又会用到队列这种数据结构,举一反三的话,层次遍历广度优先算法BFS是有一些相似的,也是用到了队列,相对应的,二叉树里面的深度优先算法DFS,会用到这种结构,这些基本都属于是二叉树这块的基础技能。

猜你喜欢

转载自blog.csdn.net/main_double/article/details/142334487