码迷,mamicode.com
首页 > 其他好文 > 详细

计算二叉树叶子结点,加深理解遍历的本质

时间:2015-07-19 10:18:32      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:二叉树   遍历   叶子   结点   个数   

// operatorTree.cpp
// 对树的操作

#include <iostream>
#include <cstdio>

// 二叉树表示法
typedef struct BiTNode
{
	int	data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

// 计算叶子结点个数
int sum1 = 0;
void countLeafNum1(BiTNode *T)
{
	if (T == NULL) {
		return;
	}
	if (T->lchild == NULL && T->rchild == NULL) {
		sum1++;
	}

	countLeafNum1(T->lchild);

	countLeafNum1(T->rchild);
}

// 1递归函数遇到全局变量,最好转化成函数参数
// 2遍历的本质强化
// 访问树的路径是相同,只不过是计算叶子结点的时机不同。
void countLeafNum2(BiTNode *T, int *sum)
{
	if (T == NULL) {
		return;
	}
	if (T->lchild == NULL && T->rchild == NULL) {
		(*sum)++;
	}

	countLeafNum2(T->lchild, sum);

	countLeafNum2(T->rchild, sum);
}

void countLeafNum3(BiTNode *T, int *sum)
{
	if (T == NULL) {
		return;
	}

	countLeafNum3(T->lchild, sum);

	countLeafNum3(T->rchild, sum);

	if (T->lchild == NULL && T->rchild == NULL) {
		(*sum)++;
	}

}


void countLeaf()
{
	BiTNode nodeA, nodeB, nodeC, nodeD, nodeE;

	memset(&nodeA, 0, sizeof(BiTNode));
	memset(&nodeB, 0, sizeof(BiTNode));
	memset(&nodeC, 0, sizeof(BiTNode));
	memset(&nodeD, 0, sizeof(BiTNode));
	memset(&nodeE, 0, sizeof(BiTNode));

	nodeA.data = 1;
	nodeB.data = 2;
	nodeC.data = 3;
	nodeD.data = 4;
	nodeE.data = 5;

	nodeA.lchild = &nodeB;
	nodeA.rchild = &nodeC;
	nodeB.lchild = &nodeD;
	nodeC.lchild = &nodeE;

	countLeafNum1(&nodeA);
	printf("sum1: %d\n", sum1);
	// sum1: 2

	int sum2 = 0;
	countLeafNum2(&nodeA, &sum2);
	printf("sum2: %d\n", sum2);
	// sum2: 2

	int sum3 = 0;
	countLeafNum3(&nodeA, &sum3);
	printf("sum3: %d\n", sum3);
	// sum3: 2

}

int main()
{
	countLeaf();

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

计算二叉树叶子结点,加深理解遍历的本质

标签:二叉树   遍历   叶子   结点   个数   

原文地址:http://blog.csdn.net/zyq522376829/article/details/46945679

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!