试设计一个程序,求二叉树的结点数目和叶子结点数目

作者&投稿:宗圣谭 (若有异议请与网页底部的电邮联系)
试设计一个程序,求二叉树的结点数目和叶子结点数目~

#include
#include

typedef char ElemType ;

#include"BiTree.h"

typedef BiTreeNode* DataType;

#include"LinQueue.h"


void LeverOrder(BiTreeNode * root) //层序遍历的函数,形参是一个二叉树的头指针,如果该二叉树有头结点则为其头结点的左子树
{
int m=0,n=0; //m为叶子节点的计数器,n为总节点
BiTreeNode *q;
LQueue head; //创建一个队列,用以存放二叉树的结点地址
QueueInitiate(&head); //初始化队列

QueueAppend(&head, root); //二叉树第一个有用结点入队列

while(QueueNotEmpty(head))
{
QueueDelete(&head,&q);
printf("%c ",q->data);
n++; //输出一个结点就进行一次计数,总计为总结点数目
if(q->leftChild!=NULL) QueueAppend(&head, q->leftChild);
if(q->rightChild!=NULL) QueueAppend(&head, q->rightChild);
if(q->leftChild==NULL&&q->rightChild==NULL) m++; //叶子节点为没有子树的结点,利用这个特点进行筛选
}
printf("
");
printf("总结点数目为:%d
",n);
printf("叶子节点数目为:%d
",m);

}

void main()

{
BiTreeNode *root, *p, *pp;

Initiate(&root);
p = InsertLeftNode(root, 'A');
p = InsertLeftNode(p, 'B');
p = InsertLeftNode(p, 'D');
p = InsertRightNode(p, 'G');
p = InsertRightNode(root->leftChild, 'C');
pp = p;
InsertLeftNode(p, 'E');
InsertRightNode(pp, 'F');

LeverOrder(root->leftChild);

Destroy(&root);
}


如果二叉树这里没有问题,应该能看明白
前一个函数是层序遍历,这些遍历的函数,书上应该都有的

只要思想就是在遍历的同时再加上计数器就行了~

有什么不明白的可以发邮件给我

zhanggangbz@21cn.com

第一次回答别人问题,不是很全面,请谅解

以前写的,不过我的是先输入矩阵的运算次数,你自己该一下该成-1退出吧。

#include <stdio.h>
#include <stdlib.h>

void print(int m, int p, int *p4); /*函数声明*/

int main()
{
int test_num = 0; /*要计算的次数*/
int comp_times = 0; /*已经执行计算的次数*/
int m, n, p, i, j, k, sum, x; /*m,n,p确定矩阵形式,i,j表行与列,sum求每次计算之和*/
int *p1 = NULL; /*定义3个指针并初始化*/
int *p2 = NULL;
int *p3 = NULL;

scanf ("%d", &test_num); /*读入要运算的次数*/

for( ; comp_times < test_num; comp_times++) /*当执行次数等于所要运行次数时退出*/
{
scanf("%d %d %d", &m, &n, &p); /*确定矩阵形式,m*n和n*p阶矩阵*/

p1 = malloc( (m * n) * sizeof(int) ); /*申请内存*/
p2 = malloc( (n * p) * sizeof(int) );
p3 = malloc( (m * p) * sizeof(int) );

for( i = 0; i < m * n; i++) /*读入第一个矩阵*/
{
scanf("%d", &*(p1 + i));
}
for( i = 0; i < n * p; i++) /*读入第二个矩阵*/
{
scanf("%d", &*(p2 + i));
}

/*以下计算矩阵乘法,并将每次的运算结果存入第三块内存*/
for(i = 0; i < m; i++)
{
for(j = 0; j < p; j++)
{
for (k = sum = 0; k < n; k++)
{
x = *(p1 + k + i*n) * *(p2 + k*p + j);
sum += x; /*累加求和*/
}
*(p3 + i*p + j) = sum;
}
}

print(m, p, p3);

free(p1);
free(p2);
free(p3);
}

return 0;
}

/*定义打印矩阵相乘结果的函数,变量分别为矩阵类型以及指
针p4用以实现每打p个数值后面就有一个回车,否则为空格*/
void print(int m, int p, int *p4)
{
int i = 0;

while (i < m * p)
{
if (i % p == p - 1)
printf("%d
", *(p4 + i));
else
printf("%d ", *(p4 + i));
i++;
}
}

//求节点数
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;

typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

Status CreateBiTree(BiTree &T)
{
TElemType e;
scanf("%d",&e);
if(e==0) T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(OVERFLOW);
T->data =e;
CreateBiTree(T->lchild );
CreateBiTree(T->rchild );
}
return OK;
}

int BTNodeCount (BiTree T)
{
int m=0,n=0;
if(T==NULL)
return 0;
else
{
m=BTNodeCount(T->lchild );
n=BTNodeCount(T->rchild );
return (m+n+1);
}
}

void main()
{
BiTree T;
printf("请输入二叉树中节点的值(int型),0表示空树:\n");
CreateBiTree(T);
printf("该树的节点数是%d\n",BTNodeCount(T));
}

//求叶子数
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;

typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

Status CreateBiTree(BiTree &T)
{
TElemType e;
scanf("%d",&e);
if(e==0) T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(OVERFLOW);
T->data =e;
CreateBiTree(T->lchild );
CreateBiTree(T->rchild );
}
return OK;
}

int LeftBiTree(BiTree T)
{
int m,n;
if(!T)
return 0;
else if(!T->lchild &&!T->rchild )
return 1;
else
{
m=LeftBiTree(T->lchild );
n=LeftBiTree(T->rchild );
return (m+n);
}
}

void main()
{
BiTree T;
printf("请输入树中节点的值(int型),0表示空树:\n");
CreateBiTree(T);
printf("该二叉树的树叶是%d\n",LeftBiTree(T));
}

如果需要两个程序合并,自己修改一下就可以了


设计一个求解一般二元一次方程组的算法,并画出程序框图
分析:根据加法消元法,求出二元一次方程组(a1b2-a2b1≠0)的解,根据求解过程,可得所求框图。(一)算法步骤:(1)输入a1,b2,a2,b1,c1,c2.(2)计算x的值为:(3)计算y的值为:(4)输出x,y的值即可。(二)程序框图:如下 ...

c语言程序设计 定义一个函数求两个数的最大值,在住函数中调用该函数求...
参考程序如下:(我自己编写的,可能有不足之处,望见谅)include<stdio.h> int max(int x,int y){ int t;t=x>y? x:y;return t;} void main(){ int a,b,c,m;printf("please input three numbers:\\n");scanf("%d,%d,%d",&a,&b,&c);m=max(max(a,b),c);printf("the max...

设计一个算法求2+4+6+8+...+100的VB程序
private sub sum()Dim i as integer,s as long for i = 2 to 100 step 2 s = s + i Next i print s end sub 以上程序就可计算并输出2+4+6+8+...+100的和

小明同学设计了一个计算程序如图如果输入的数是二那么输出的结果是...
(1)(-4-8)×9=-12×9=-108.答:输出的数是-108.(2)把2输入,得(2-8)×9=-54,∵|-54|<100,∴再把-54从头输入,得(-54-8)×9=-558.答:输出的数是-558.

c语言程序设计 设计一个求解一元二次方程的函数,在主函数中输入方程的系...
\/ include <stdio.h> include <math.h> void calcu(double a,double b,double c);int main(void){ double a, b, c;char ch;do { printf("请输入一元二次方程的三个系数:\\n");printf("a=\\t");scanf("%lf", &a);printf("b=\\t");scanf("%lf", &b);printf("c=\\t");scan...

用C++语言编写一个程序计算分别选修2,3和4门课程学生的平均分。其中,求...
using namespace std;float aver(int a,int b){return (a+b)\/2.0;} float aver(int a,int b,int c){return (a+b+c)\/3.0;} float aver(int a,int b,int c,int d){return (a+b+c+d)\/3.0;} int main(){ cout<<aver(67,89)<<endl;cout<<aver(67,89,77)<<endl;cou...

设计一个程序,计算输入的两个数的和与差,要求自定义一个函数 sum_diff...
int main(void){ void sum_diff(float op1,float op2,float*psum,float*pdiff);float psum,pdiff;float op1,op2;\/\/输入op1,op2,并且是float,所以用%f;printf("输入:");scanf("%f%f",&op1,&op2);\/\/调用自定义函数;sum_diff(op1,op2,&psum,&pdiff);printf("*psum=%f,*pdiff=%f",...

设计一个vc++程序,已知二元一次方程3X的平方加4X加5等于0,求方程的一...
看图!

设计一个算法计算1×2×3×…×100,画出程序框图.
第一步:设i的值为1; 第二步:设S的值为1;× 第三步:如果i≤100执行第四步, 否则转去执行第七步; 第四步:计算S×i并将结果代替S; 第五步:计算i+1并将结果代替i; 第六步:转去执行第三步; 第七步:输出S的值并结束算法.

设计一个计算一元二次方程根的程序:从文本框输入一元二次方程的三个系 ...
if(a==0) \/*二次项系数为0,即为一元一次方程的情况*\/ { if(b==0&&c!=0)printf("无解!\\n");else if(b==0&&c==0)printf("解是任意的.\\n");else printf("%f\\n",(-c)\/b);} else \/*接下来,是a不为0的情况*\/ { disc=b*b-4*a*c;if(disc==0) \/*判别式等于0...

罗平县18886081064: 试设计一个程序,求二叉树的结点数目和叶子结点数目 -
木策桑麻: //求节点数 #include #include #include #define TRUE 1 #define FLASE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status;typedef int TElemType; typedef struct BiTNode {TElemType ...

罗平县18886081064: 设计一算法,计算给定二叉树T中度为2的结点个数. -
木策桑麻:[答案] 算法如下,将指向树的根节点的指针作为入参返回的即为度为2的全部结点的个数. int countDegreeTwo(TreeNode *root) { if (root == NULL) return 0; if (root->left != NULL && root->right != NULL) return 1 + countDegreeTwo(root->left) + countDegreeTwo(...

罗平县18886081064: 如何才能C语言编程实现求一棵二叉树的结点总数?急!!! -
木策桑麻: int countnode(bt *h) //其中bt是二叉树的结点(结构体) {if(!bt)return 0; int a,b; a=countnode(h^.lchild); b=countnode(h^.rchild); return a+b+1; }

罗平县18886081064: 设计算法,统计二叉树中等于给定值x的结点个数,统计值由K带回,不需要具体程序,只要算法, -
木策桑麻:[答案] 采用深度优先的示例:(广度优先不妨自己试试) void countl(bitreptrr, datatype x, int& k) { \x09if(!bitreptrr) return ; \x09if(bitreptrr->value==x){k++;} \x09countl((bitreptrr->left, x, k); \x09countl((bitreptrr->right, x, k); } 是否可以解决您的问题?

罗平县18886081064: 计算二叉树中所有节点的数目(C++编程) -
木策桑麻: int GetBTreeCount(BTree T) { if(T==NULL) return 0; return 1+GetBTreeCount(T->lc)+GetBTreeCount(T->rc); }

罗平县18886081064: 设计算法求二叉树所包含的叶结点的数目.(给出设计思想,再用代码实现)
木策桑麻: 设计思想; 遍历到每个结点判断是否是叶子,是就加1,总数等于根(如果是叶子)+ 左子树+ 右子树: int Leaf(BiTree T)//T为根结点指针 { int n = 0; if (T != NULL) { if (T-&gt;leftchild == NULL &amp;&amp; T-&gt;rightchild == NULL)// 改这个条件,就可以计算结点数或者度为1 ++ n; n = n + Leaf(T-&gt;leftChild) + Leaf(T-&gt;rightchild); } return n; }

罗平县18886081064: 怎么用C语言写求一棵二叉树的叶子结点个数 -
木策桑麻: int LeaveCount(BiTree T) { int i=0;if(T->leftchild) {i++; i+=LeaveCount(BiTree T->leftchild);}if(T->rightchild) {i++; i+=LeaveCount(BiTree T->rightchild);} return i; }

罗平县18886081064: 试编程求二叉树T的总结点数 -
木策桑麻: 二叉树就是说一个结点下面可能有两个子结点(度为2),也可能有一个子结点(度为1),或者没有子结点(度为0,也叫叶子结点) 那么在这棵树中只可能出现三种情况:度为2,度为1,度为0(叶子结点).不可能出现其他情况,否则就不是二叉树了. 所以,总结点数应该为三者之和. 已经知道:度为0=70,度为1=80 度为2=度为0-1=69(这是公式,原因说起来太麻烦,你自己画个图可能会更清楚.) 所以:总结点数=度为2+度为1+度为0=69+80+70=219

罗平县18886081064: C++: 编写程序,创建一个二叉树.实现统计二叉树叶子结点的个数和二叉树的深度 -
木策桑麻: #include typedef int ElemType; //数据类型//定义二叉树结构,与单链表相似,多了一个右孩子结点 typedef struct BiTNode{ ElemType data; //数据域 struct BiTNode*lChild, *rChlid; //左右子树域 }BiTNode, *BiTree;//先序创建二叉树 int ...

罗平县18886081064: 设一棵二叉树以二叉链表为存储结构,试写出求该二叉树中所有叶子结点数的算法. -
木策桑麻: //我做了一个程序,可以实现二叉树的左右子树的交换功能,#include<iostream.h>/* 二叉树类型的定义(二叉链表形式储存) */ typedef char datatype; // 树的结点数据类型为字符型,可以根据需要修改 typedef struct node *pointer; // 定义二叉...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网