学习随记三十七——统计二叉树中不同结点类型的个数

统计二叉树中不同结点类型的个数

前言:收到非递归打印一个树的函数的启发,我可以利用栈来实现较高效率的统计二叉树中不同结点的个数

**函数思路:**先声明一个结点指针类型的栈,进行循环,循环条件为结点指针非空或栈非空(当结点指针与栈都为空时说明已经进行到树的最右端,完成了树的遍历),每次循环时都先将结点的左边一条儿子入栈,然后若栈非空则取栈顶指针,然后出栈,若该结点有两个子结点则满结点变量加一,反之若有一个儿子则结点变量加一,否则则为树叶统计树叶的变量加一,然后移动结点到其右儿子,遍历其右子树;当循环结束时则统计完成。

结点声明:

typedef int ElementType;
typedef struct Treenode{
	ElementType data=0;
	struct Treenode* Left=nullptr;
	struct Treenode* Right=nullptr;
}Treenode;
typedef Treenode* Bintree;

统计函数:

void Count(Bintree root){
	stack<Bintree>str;
	int node=0,leaves=0,fullnode=0;
	while(root||!str.empty()){
		for(;root;root=root->Left) str.push(root);
		if(!str.empty()){
			root=str.top();
			str.pop();
			if(root->Left&&root->Right) fullnode++;
			else if(root->Left||root->Right) node++;
			else leaves++;
			root=root->Right;
		}
	}
	cout<<"The fullnodes have "<<fullnode<<endl;
	cout<<"Nodes with one child have "<<node<<endl;
	cout<<"Leaves have "<<leaves<<endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值