/*
在二叉链表中增加DescNum域,求二叉树每个结点的子孙数目并存入DescNum域
思路:
初始全部设置为0,使用递归计算子孙结点数
输入:
三层的满二叉树:124##5##36##7##
*/
#include <iostream>
#include <malloc.h>
#include <deque>
using namespace std;
const int maxsize = 100;
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
int DescNum;
}*BiTree;
void creTree(BiTree &T){
char c;
cin >> c;
if(c=='#')
T = NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = c;
T->DescNum = 0;
creTree(T->lchild);
creTree(T->rchild);
}
}
int f(BiTree &T){
if(T!=NULL){
if(T->lchild)
T->DescNum += 1;
if(T->rchild)
T->DescNum += 1;
T->DescNum += f(T->lchild);
T->DescNum += f(T->rchild);
return T->DescNum;
}
return 0;
}
//层次遍历输出每个结点的子孙数目
void PrintTreeByLevel(BiTree T)
{
if(T == NULL) return;
deque<BiTree> q;
q.push_back(T);
int curLevelNum; // 当前层的结点数
while (q.size())
{
curLevelNum = (int)q.size(); // 此处要做类型转换,因为size()返回值为size_type类型;
while(curLevelNum-- > 0) // 一直访问到当前层的最后一个结点
{
BiTree tmp = q.front();
q.pop_front();
printf("%d ", tmp->DescNum);
if(tmp->lchild)
q.push_back(tmp->lchild);
if(tmp->rchild)
q.push_back(tmp->rchild);
}
printf("\n"); // 当前层的元素输出完毕后,换行;
}
}
int main(){
BiTree T;
char c;
cout << "输入二叉树结点:";
creTree(T);
f(T);
PrintTreeByLevel(T);
return 0;
}
求二叉树各个结点的子孙结点数
最新推荐文章于 2022-10-28 11:35:16 发布