2022年12月3日 求树的总结点数的另一种解法


结构体中
num是指以该节点为子树中的所有节点的数目,注意不包括此根节点
data是节点中的数据值
指向左右孩子的指针
一个构造函数,用于初始化树

算法思想:
定义一个结构体,结构体中定义了一个子树中除了根节点的结构总数,递归的遍历左子树和右子树。
该递归的出口为当节点为空节点时,此层递归结束;
当节点为叶子节点后,计数+1,此层递归结束;
举例:
假设一种特殊的情况,只有左子树,那么每次进函数之后在判断该节点不是空节点之后,就会先让他的左子树再进递归,直到他为叶子结点,计数+1,此层递归结束;
然后倒数第二个节点为只有左子树的节点,他的节点总数为以该节点为根节点的子树的节点+此节点,即计数+1,此层递归结束;
右子树同理,也为递归出口;
在这里插入图片描述

在算法的最后递归完左子树和右子树之后,将二者相加要+1,1就是子树的根节点】

#include<iostream> 
using namespace std;

typedef struct tnode
{
	int num;
	//以该节点为子树中的所有节点的数目 
	int data; 
	struct tnode *lchild,*rchild; 
	tnode(int _data){
		data = _data;
		lchild = NULL;
		rchild =  NULL;
	}
}BTNode,*BTPtr;


class Btree{

	public:
		
		BTNode* creatTree(){
			BTNode *p;
			int data;
			cin >> data;
			if (data == 0) p = NULL;
			else{
				p = new BTNode(data);
				p->lchild = creatTree();
				p->rchild = creatTree();
			}
			return p;
		}
		
		void fillnum(BTPtr bt){
			
			if(!bt) return ;
			bt->num = 0;
			fillnum(bt->lchild);
			fillnum(bt->rchild);
		
			if(!bt->lchild && !bt->rchild){
				//处理 叶节点 
				bt->num = bt->num+1;
				cout << "叶子结点:"<<bt->num<<endl; 
				return;
			} 
			if(bt->lchild && !bt->rchild){
				//只有左子树 
				bt->num = bt->lchild->num+1;
				cout << "左子树结点:"<<bt->num<<endl;
				return;
			}
			if(!bt->lchild && bt->rchild){
				//只有左子树 
				bt->num = bt->rchild->num+1;
				return;
			}
			//bt->num = bt->lchild->num + 1 + bt->rchild->num + 1;
			bt->num = (bt->lchild->num + bt->rchild->num)+1;
			
	}
		
};


int main(){
	
	Btree T;
	BTNode* bt;
	bt = T.creatTree();
	bt->num = 0;
	T.fillnum(bt);
	cout<<bt->num;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值