写者,只拿一个案例举例。我们有一颗高度为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,按照以上代码的逻辑,遍历顺序如下:
- 首先,递归调用
countNodes(root.left),对左子树进行遍历。 - 对于节点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的子节点遍历完,返回上一级,遍历右子树)
- 对于节点8,进入递归调用
- 对于节点4,进入递归调用
- 对于节点2,进入递归调用
就都是,先去其左子树,走到底,计数+1,返回上一级,去右子树的根节点,在去左节点,去右节点,返回时+1
因此,对于高度为4的完全二叉树,编号从1到15,按照以上代码的逻辑,遍历顺序是1、2、4、8、5、9、10、3、6、11、12、7、13、14、15。
2319

被折叠的 条评论
为什么被折叠?



