递归是怎么运作的呢?

        写者,只拿一个案例举例。我们有一颗高度为4的完全二叉树,编号从1~15,1为根节点,求此二叉树的节点个数;代码如下:

class Solution {
    public int countNodes(TreeNode root) {
        if(root==null){
            return 0;
        }
        int left = countNodes(root.left);
        int right = countNodes(root.right);
        return left+right+1;
    }
}

        它在递归中如何计数的,没有看见有计数的变量呢?

        在递归调用 countNodes(root.left) 和 countNodes(root.right) 后,会得到左子树和右子树的节点个数。然后,将左子树的节点个数和右子树的节点个数加上根节点,即可得到整个二叉树的节点个数。

这里的关键是递归的返回值,递归调用返回的是子树的节点个数。在最终的递归调用中,当根节点为null时,返回0,递归会逐层向上返回节点个数。

通过递归的方式,每一层返回的节点个数都会被累加,最终得到整个二叉树的节点个数。这样就实现了计数的功能,只是没有显式地使用计数变量。

        顺序是怎么样的?

对于一个高度为4的完全二叉树,编号从1到15,按照以上代码的逻辑,遍历顺序如下:

  1. 首先,递归调用 countNodes(root.left) ,对左子树进行遍历。
  2. 对于节点1,进入递归调用 countNodes(root.left) ,对左子树进行遍历。
    • 对于节点2,进入递归调用 countNodes(root.left) ,对左子树进行遍历。
      • 对于节点4,进入递归调用 countNodes(root.left) ,对左子树进行遍历。
        • 对于节点8,进入递归调用 countNodes(root.left) ,对左子树进行遍历。
          • 对于节点没有左子节点,返回0。
          • 对于节点没有右子节点,返回0。
          • 返回节点个数0+0+1=1。
        • 返回上一级,遍历其右子树,即节点9,同理:1+1=2.(节点4的子节点遍历完,返回上一级,遍历右子树)

就都是,先去其左子树,走到底,计数+1,返回上一级,去右子树的根节点,在去左节点,去右节点,返回时+1

因此,对于高度为4的完全二叉树,编号从1到15,按照以上代码的逻辑,遍历顺序是1、2、4、8、5、9、10、3、6、11、12、7、13、14、15。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值