二叉树递归遍历结点个数

这里先直接按照上一篇博客单链表的递归套路写下来。

int count(BiTree root){
	if (root == NULL){
		return 0;
	}
	int l_count = conut (root->lchild);
	int r_count = count (root->rchild);
	return l_count + r_count + 1;
}

其实,单链表是“一叉树”,遍历的时候只有写一个递归句子就好了,二叉树相当于向左遍历一次,向右遍历一次。
难想的是,为什么二叉树写两个递归就可以表示所有节点个数了呢?

  • 只看左子树那条边时,就是单链表的套路,加上右子树时,每条左子树执行完时,会把当前结点的右边算上,右边一样是单链表的套路。
  • 左边执行到底,然后执行左边的右边。
  • …这些解释很难理解

这样抽象的东西要想理解,可以画图,也可以和具体的含义联系起来。

递归就是往后走嘛,上面的代码两条递归,就是向两边递归,至于递归先后,可以没有先后,因为是两条路,总是一条走完走另一条,我们放眼全局的话,就是两条路一起走。
也就是说,递归完成的就是向后走,然后依次返回的功能,没到return之前都是走的过程,经过return就是返回的过程。
那么上面的代码就理解为:如果走到空了,返回的时候就是0,如果不是空,就返回左子树和右子树节点数加1(1是根节点)。每次向上都是这样,直到root。

可以把递归理解为一个功能count(BiTree root)是计算root树的节点数。它是计算左边conut (root->lchild)和右边count (root->rchild)树个数+1。结束。
不要多想。

你可能感兴趣的:(C与C++)