㈠ c语言中怎样用递归遍历叶子节点,并打印出来
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
char data;
struct node *left,*right;
} node;
void fout(node *root)/*输出叶结点*/
{
if (root)
{
if (!(root->left)&&!(root->right)) putchar(root->data);
fout(root->left);
fout(root->right);
}
}
node *ins(node *root,char ad)/*演示辅助函数,用于建立二树*/
{
if (root==NULL)
{
root=malloc(sizeof(node));
root->data=ad;
root->left=root->right=NULL;
}
else if (ad<root->data) root->left=ins(root->left,ad);
else if (ad>=root->data) root->right=ins(root->right,ad);
return root;
}
void FREE(node *root)/*演示辅助函数,用于释放空间*/
{
if (!(root->left)&&!(root->right)) free(root);
else
{
if (root->left) FREE(root->left);
if (root->right) FREE(root->right);
}
}
int main(void)
{
node *root=NULL;
char ch;
while ((ch=getchar())!='\n')/*输入一个以回车结束的字符串,用于建立二叉树*/
{
root=ins(root,ch);
}
fout(root);/*输出叶结点*/
FREE(root);/*删除二叉树*/
return 0;
}
㈡ C语言求树中的叶子结点数
有从上至下和从下至上两种方式可以统计树的节点数。
设叶子节点(度为0的节点)数为x:
从上至下时,度为n的节点有n个子节点,再加上根节点,总结点数量为1+4×1+3×2+2×3+1×4+0×n=21
从下至上时,节点数为度为0~4的所有节点数相加,总节点数量为1+2+3+4+n=10+n
所以有21=10+n,得n=11.
㈢ 数据结构创建一棵树的c语言代码怎么写
刚刚回答了一个类似的问题,以下代码供参考:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char TElemType;
typedef int Status;
typedef struct BiTNode { // 结点结构
TElemType data;
struct BiTNode *lchild, *rchild;
// 左右孩子指针
} BiTNode, *BiTree;
//以下是建立二叉树存储结构,空节点输入作为#结束标识
Status CreateBiTree(BiTree &T) {
//请将该算法补充完整,参见第6章课件算法或课本
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
} // CreateBiTree
void Preorder(BiTree T)
{
if(T)
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
void Inorder(BiTree T)
{ // 中序遍历二叉树
//请将该算法补充完整,参见第6章课件算法
if(T)
{
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}
void Postorder(BiTree T)
{ // 后序遍历二叉树
//请将该算法补充完整,参见第6章课件算法
if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}
//以下是求叶子结点数
void CountLeaf(BiTree T,int& count){
//请将该算法补充完整,参见第6章课件算法
if(T){
if((!T->lchild)&&(!T->rchild))
count++;
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
}
//以下是求二叉树的深度
int Depth(BiTree T ){
//请将该算法补充完整,参见第6章课件算法
int depthval,depthLeft,depthRight;
if(!T) depthval=0;
else{
depthLeft = Depth(T->lchild);
depthRight = Depth(T->rchild);
if(depthLeft>depthRight)depthval = 1+depthLeft;
else depthval = 1+depthRight;
}
return depthval;
}
void main(){
BiTree T;
int s=0,d;
printf("\n creat of the bitree:\n");
CreateBiTree(T);
printf("\n output result of Preorder:\n");
Preorder(T);
CountLeaf(T,s);
d=Depth(T);
printf("\n leaves=%d\n",s);
printf("\n depth=%d\n",d);
}
㈣ 怎么计算C语言的二叉树中的叶子节点数
结点的度是指,该结点的子树的个数,在二叉树中,不存在度大于2的结点。
计算公式:n0=n2+1
n0
是叶子节点的个数
n2
是度为2的结点的个数
n0=n2+1=5+1=6
故二叉树有5个度为2的结点,则该二叉树中的叶子结点数为6。
(4)c语言树叶结点怎么写扩展阅读
叶子结点是离散数学中的概念。一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。
叶子是指度为0的结点,又称为终端结点。
叶子结点
就是度为0的结点
就是没有子结点的结点。
n0:度为0的结点数,n1:度为1的结点
n2:度为2的结点数。
N是总结点
在二叉树中:
n0=n2+1;
N=n0+n1+n2
参考资料:叶子结点_网络
㈤ 按先序遍历输出叶子结点的程序(可以用C++运行的C语言程序)
#include<stdlib.h>
#include<stdio.h>
typedefstructbitnode{
intdate;
structbitnode*lchild,*rchild;
}bitnode,*bitree;
intj=0;
//函数说明
bitree*createbitree(bitree*T);
intQtraversebitree(bitreeT);
intZtraversebitree(bitreeT);
intHtraversebitree(bitreeT);
intFtraversebitree(bitreeT);
/*******************主函数****************************/
main()
{
bitreeTree,*T;intk;
do
{
printf(" ╔-----------------------------------------------╗");//显示一个简易菜单
printf(" ┆先序创建----1先序遍历------2┆");
printf(" ┆中序遍历----3后序遍历------4┆");
printf(" ┆叶子个数---5退出程序------6┆");
printf(" ╚-----------------------------------------------╝ ");
printf("请输入所要进行的操作序号:");
scanf("%d",&k);//接受用户的选择
switch(k)//接受用户的函数
{case1:printf("左右子树为空时用0代替,用间隔符隔开: ");
T=createbitree(&Tree);
break;
case2:Qtraversebitree(*T);
break;
case3:Ztraversebitree(*T);
break;
case4:Htraversebitree(*T);
break;
case5:printf(" 叶子个数为:%d ",Ftraversebitree(*T));
break;
case6:break;
default:printf("错误选择!请重选 ");break;
}
}while(k!=6); //直到i被赋值为6
return0;
}
/*******************创建二叉树函数****************************/
bitree*createbitree(bitree*T)
{
charch;
scanf("%d",&ch);
if(ch==0)
(*T)=NULL;
else{
if(!((*T)=(bitnode*)malloc(sizeof(bitnode))))
exit(0);
(*T)->date=ch;//生成根节点
createbitree(&(*T)->lchild);
createbitree(&(*T)->rchild);
}
returnT;
}
/*******************先序遍历函数****************************/
Qtraversebitree(bitreeT)
{
if(T){printf("%d",T->date);
if(Qtraversebitree(T->lchild))
if(Qtraversebitree(T->rchild))return1;
return0;
}
elsereturn1;
}
/*******************中序遍历函数****************************/
Ztraversebitree(bitreeT)
{
if(T){if(Ztraversebitree(T->lchild))
printf("%d",T->date);
if(Ztraversebitree(T->rchild))return1;
return0;
}
elsereturn1;
}
/*******************后序遍历函数****************************/
Htraversebitree(bitreeT)
{
if(T){if(Htraversebitree(T->lchild))
if(Htraversebitree(T->rchild))
printf("%d",T->date);return1;
return0;
}
elsereturn1;
}
/******************返回叶子节点个数函数*************/
Ftraversebitree(bitreeT)
{
if(T){if(!((T->lchild)||(T->rchild)))j++;
if(Ftraversebitree(T->lchild))
if(Ftraversebitree(T->rchild))returnj;
returnj;
}
elsereturnj;
}
㈥ c语言 统计二叉树的叶节点个数,并输出每个叶节点到根结点的路径
int countTreeNode(TreeNode * root, Queue *queue)
{
if (root == NULL)
return 0;
queue->push(root);//入队
if (root->left == NULL && root->right == NULL)
{
queue->print();//打印队列中的元素
queue->pop();//出队
return 1;
}
int count = countTreeNode(root->left, queue) + countTreeNode(root->right,queue);
queue->pop();//出队
return count;
}
㈦ 如何用C语言画一片树叶(如果好在话给高分)
#include "math.h"
#include <graphics.h>
#include <stdlib.h>
#include <time.h>
void main(void)
{
int gdriver=DETECT,gmode ;
int ran_number ;
float a,b,c,d,e,f ;
float x,y,x_pre,y_pre ;
float disp_x,disp_y ;
initgraph(&gdriver,&gmode,"\\tc");
/* setfillstyle(SOLID_FILL,RED);*/
randomize();
setbkcolor(BLUE);
setcolor(14);
x=y=x_pre=y_pre=0 ;
ran_number=90 ;
while(kbhit()==0)
{
ran_number=random(100)+1 ;
if(ran_number==1)
{
a=0 ;
b=0 ;
c=0 ;
d=0.15 ;
e=0 ;
f=0 ;
}
else if(ran_number>1&&ran_number<=86)
{
a=0.87 ;
b=0.014 ;
c=-0.014 ;
d=0.87 ;
e=0 ;
f=1.6 ;
}
else if(ran_number>86&&ran_number<=93)
{
a=0.26 ;
b=0.472 ;
c=0.772 ;
d=0.34 ;
e=0 ;
f=1.6 ;
}
else
{
a=0.28 ;
b=0.867 ;
c=-0.478 ;
d=0.4 ;
e=0 ;
f=0.44 ;
}
x=a*x_pre*cos(b)-d*sin(c)*y_pre+e ;
y=c*x_pre*sin(b)+d*cos(c)*y_pre+f ;
x_pre=x ;
y_pre=y ;
disp_x=(x+5)*639/12 ;
disp_y=350-y*28 ;
putpixel((int)disp_x,(int)disp_y,GREEN);
}
getch();
getch();
closegraph();
}
十分买这个图形很便宜了,呵呵!
㈧ 已知二叉树的先序遍历序列和中序遍历序列,统计该二叉树中叶子结点的个数 用C语言怎么编写急急急在考试
int LeafNodes(BiTree T)
{ if(T==NULL) return 0;
else if((T->lchild==NULL)&&(T->rchild==NULL)) return 1;
else
{ numl=LeafNodes (T->lchild);
numr=LeafNodes (T->rchild);
return numr+numl;
}
或者:
public int getNumberOfLeavesByQueue(BinaryTreeNode root){
int count = 0; //叶子节点总数
LinkQueue<BinaryTreeNode> queue = new LinkQueue<>();
if(root != null){
queue.enQueue(root);
}
while (!queue.isEmpty()) {
BinaryTreeNode temp = (BinaryTreeNode) queue.deQueue();
//叶子节点:左孩子节点和右孩子节点都为NULL的节点
if(temp.getLeft() == null && temp.getRight() == null){
count++;
}else{
if(temp.getLeft() != null){
queue.enQueue(temp.getLeft());
}
if(temp.getRight() != null){
queue.enQueue(temp.getRight());
(8)c语言树叶结点怎么写扩展阅读:
根据访问结点操作发生位置命名:
① NLR:前序遍历(Preorder Traversal 亦称(先序遍历))
——访问根结点的操作发生在遍历其左右子树之前。
② LNR:中序遍历(Inorder Traversal)
——访问根结点的操作发生在遍历其左右子树之中(间)。
③ LRN:后序遍历(Postorder Traversal)
——访问根结点的操作发生在遍历其左右子树之后。
注意:
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
㈨ C语言 求二叉树根节点到叶子节点的路径
它的算法思想应该是
1,以一指针指向该叶子结点并向上(父结点)找,把父节点入栈(方便输出路径)
2,把指针指向父节点,重复上面的过程,直到节点的父节点为空
3,依次出栈输出信息,路径就出来了
(注:此二叉树的节点应包括父指针,左右指针,数据域)
就这么多吧! 要学习程序,就得自己尝试写,写多了就会了
还有什么不懂的可以给我留言 !!
㈩ C语言二树叶子结点
这个画一下就知道了。
第一层 度为2的一个
第二层 2个
总计五个度为2 的,那么第三层就是2个度为2 的节点 另外两个为叶子节点。
第四层,4个叶子节点。
总计6个。
这个是不存在度为1 的情况。
事实上,度为1的节点个数,不影响叶子节点个数的。