二叉树的最大深度-递归算法和非递归算法

递归算法

递归算法:指一种通过重复将问题分解为同类的子问题而解决问题的方法。

如何通过递归求出一棵二叉树的最大深度,首先递归算法特别重要的一个部分就是结束条件,那么结束条件怎么定义呢?对于二叉树而言,递归就是不断递归二叉树的左右结点,那么结束条件自然就是当结点为null时

if (root == null) {
	return 0;
}

递归还有一个部分就是递归的规律,那么对于求解二叉树最大深度,递归规律是什么呢?我们在每次调用递归函数的时候相当于遍历一个树的结点,那么如何得到最大深度呢?就是在调用递归函数的时候,对于左右子树取一个较大的值,同时+1,相当于每一次调用递归函数便调用自身两次,并取这两次的较大值

public int maxDepth(TreeNode root) {
    if (root == null) {
        return 0;
    }
    return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}

非递归算法(BFS)

对二叉树进行广度优先遍历,使用一个队列将每个节点加入到队列中,每加完二叉树的一层便加入一个标志,每次出队时对出队的元素进行判断是否是标志元素,如果时标志元素则表示这一层已经遍历完,count++,如果不是标志元素则将左右节点不是null的加入到队列中,依次重复这一步操作

public int maxDepth(TreeNode root) {
    int count = 0;
    Queue<TreeNode> queue = new LinkedList<>();
    // 判断根节点是否为空
    if (root != null) {
        queue.offer(root); // 入队
        queue.offer(null); // 对于根节点这一层设置一个null标志
    }
    while (!queue.isEmpty()) {
        root = queue.poll(); // 出队
        if (root == null) { // 如果是null则表示这一层遍历完,深度++
            if (!queue.isEmpty()) { // 判断是否是最后一个元素
                queue.offer(null); // 如果不是最后一个元素就进行入队操作
            }
            count++; // 深度+1
        } else {
            if (root.left != null) {
                queue.offer(root.left);
            }
            if (root.right != null) {
                queue.offer(root.right);
            }
        }
    }
    return count;
}

为什么队列操作不使用add和remove,而使用offer和poll呢?

  1. add和offer都是添加一个元素,不同之处在于,如果超出队列的界限时,add会抛出一个异常,而offer会返回false
  2. remove和poll都是从链表首抽取一个元素,区别在如果链表为空时remove会抛出一个异常,而poll则是返回一个null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值