剑指offer55-I-二叉树的深度

问题描述

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

例如:

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

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

解题思路

深度优先搜索(DFS)

也可以理解为二叉树的递归遍历,
我们将二叉树的深度作为参数,然后进行二叉树的递归遍历,当遍历到叶结点的时候,就将父节点的深度与当前最大深度进行比较,如果父节点的深度更大,就更新当前最大深度。否则的话,深度值加1,继续递归的寻找左右子树。

class Solution {
     
    private int mDepth;             //全局变量,保存当前最大深度
	private void SeaMaxDepth(TreeNode p, int i) {
     
        //当p结点为空时,说明此时到了叶结点,然后将父节点的深度与当前最大深度进行比较
        //以便更新当前最大深度
        if(p==null){
     
            mDepth=Math.max(i,mDepth);
        }else{
     
            SeaMaxDepth(p.left,i+1);        //否则的话,深度值+1,继续寻找左子树
            SeaMaxDepth(p.right,i+1);       //继续寻找右子树
        }
    }
	public int maxDepth(TreeNode root) {
     
        SeaMaxDepth(root,0);
        return mDepth;
	}
}

层次遍历(BFS)

树的层序遍历 / 广度优先搜索往往利用 队列 实现。
关键点: 每遍历一层,则计数器 +1+1 ,直到遍历完成,则可得到树的深度。
层次遍历的具体步骤可以参看二叉树的层序遍历

class Solution {
     
	public int maxDepth(TreeNode root) {
     
        if(root==null){
     
            return 0;
        }
        int mDepth=0;
        //linkedlist的remove方法是移出链头元素
        LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
        //将根节点入队,然后不断的遍历队列
        queue.add(root);        
        while(!queue.isEmpty()){
     
            //获取当前队列的长度,这个队列的长度相当于当前层次的结点个数
            int size=queue.size();
            //将队列中的元素都拿出来,并将其左右结点都入队。每一个for循环,都对应着一个层次
            for(int i=0;i<size;i++){
     
                TreeNode p=queue.remove();
                if(p.left!=null){
     
                    queue.add(p.left);
                }
                if(p.right!=null){
     
                    queue.add(p.right);
                }
            }
            //每遍历一层,当前层次即深度+1
            mDepth++;
        }
        return mDepth;
	}
}

你可能感兴趣的:(leetcode,程序设计与算法,Java,算法,二叉树)