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

// 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;
}

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

时间: 2024-10-18 02:39:34

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

PTA 统计二叉树叶子结点个数

6-2 统计二叉树叶子结点个数 (10 分) 本题要求实现一个函数,可统计二叉树的叶子结点个数. 函数接口定义: int LeafCount ( BiTree T); T是二叉树树根指针,函数LeafCount返回二叉树中叶子结点个数,若树为空,则返回0. 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> typedef char ElemType; typedef struct BiTNode { ElemType data; st

二叉树的创建,先中后序输出,计算叶子结点数目

#include <stdio.h> #include <iostream> #include <algorithm> using namespace std; typedef struct BiTNode { char data; struct BiTNode *l; struct BiTNode *r; } BiTNode,*BiTree; void CreatBiTree(BiTree &T) { ///按先序次序输入二叉树中结点的值(一个字符),创建二叉

二叉树(二)——遍历、深度统计、叶子结点统计、结点统计

1.二叉树的相关算法的实现(链表). #include <stdio.h> #include <malloc.h> #define NULL 0 typedef struct tree { int data; struct tree *left, *right; }ElemBT; void create_btree(ElemBT *root, int list[], int n) /*n表示list数组中元素的个数*/ { int i; ElemBT *current, *pare

Java实现二叉树地遍历、求深度和叶子结点的个数

一.分析 二叉树是n个结点所构成的集合,它或为空树,或为非空树.对于非空树,它有且仅有一个根结点,且除根结点以外的其余结点分为两个互不相交的子集,分别称为左子树和右子树,它们本身又都是二叉树. 显而易见,二叉树具有递归的性质,因此表示二叉树的结点至少要包含3个域:数据域.左指针.右指针.在Java中,我们可以将二叉树的结点视为一个类,其中含有左子树地址.右子树地址和数据三个属性,每个结点即使类的实例化对象.因为二叉树的递归性质,所以我们可以通过递归来实现二叉树地求深度.求叶子结点的个数.先序.中

计算二叉树中叶子结点个数的方法

基础知识: 1.二叉树第i层最多有2^(i-1)个结点. 2.深度为k的二叉树至多有2^k-1个结点. 一个完全二叉树有七百个结点,问该二叉树有多少个叶子结点 根据“二叉树的第i层至多有2^(i − 1)个结点:深度为k的二叉树至多有2^k − 1个结点(根结点的深度为1)”这个性质:因为2^9-1 < 700 < 2^10-1 ,所以这个完全二叉树的深度是10,前9层是一个满二叉树,这样的话,前九层的结点就有2^9-1=511个:而第九层的结点数是2^(9-1)=256所以第十层的叶子结点数

Swust OJ973: 统计利用先序遍历创建的二叉树叶结点的个数

题目简述 利用先序递归遍历算法创建二叉树并计算该二叉树叶结点的个数. 输入 接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树). 输出 输出对应的二叉树叶结点的个数. 样例输入复制 ABCD###EF##G### A##B## #A 样例输出复制 3Step One:先序递归遍历算法创建二叉树 void CreateTree(BiTree *&tree) { char ch; cin>>ch; if(ch=='#') tree=NULL

(7)计算二叉树的高度和结点数——3

通过使用后序遍历的方式计算二叉树的高度.可以先计算左子树的高度h1,后计算右子树的高度h2,树的高度h3. h3 = max (h1, h2) + 1 ; 二叉树的高度,也就是从根结点出发一直到叶结点的路径的长度. 因为在每种遍历方法中对每个结点都仅访问一次,所以可以在进行遍历时对结点的数目进行计算. --整理自<C/C++程序员面试宝典>

二叉树中所有的路径(从根节点到叶子结点)

1 import java.util.ArrayList; 2 3 /** 4 * 寻找最短的二叉搜索的路径,从根节点到叶子结点 5 * 6 * @author jinfeng 7 * 8 */ 9 public class FindShortestBTPath { 10 11 // 用来记录所有的路径 12 private ArrayList<ArrayList<Integer>> allPaths = new ArrayList<ArrayList<Integer&

计算二叉树的深度,结点的个数。

//算法5.5 计算二叉树的深度,结点的个数. #include<iostream> using namespace std; //二叉树的二叉链表存储表示 typedef struct BiNode { char data; //结点数据域 struct BiNode *lchild,*rchild; //左右孩子指针 }BiTNode,*BiTree; //用算法5.3建立二叉链表 void CreateBiTree(BiTree &T) { //按先序次序输入二叉树中结点的值(一