
结构体中
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;
}
2204

被折叠的 条评论
为什么被折叠?



