#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#include<malloc.h>
#include<stdlib.h>
#define ERROR 0
#define STACK_INIT_SIZE 100
#define OVERFLOW -1
#define FALSE 0
#define TRUE 1
#define OK 1
int i=0;
struct tree{
char data;
struct tree *Lchild,*Rchild;
};
typedef struct tree SElemType;
typedef int Status ;
struct STACK
{
SElemType *base;
SElemType *top;
int stacksize;
};
typedef struct STACK *pSqstack;
typedef struct STACK SqStack;
Status InitStack(SqStack **S)
{
(*S)=(SqStack *)malloc(sizeof(SqStack));
(*S)->base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
if(!(*S)->base) exit (OVERFLOW);
(*S)->top=(*S)->base;
(*S)->stacksize=STACK_INIT_SIZE;
return OK;
}
Status StackEmpty(SqStack S)
{
if(S.top==S.base) return TRUE;
else
return FALSE;
}
Status Push(SqStack *S,SElemType e)
{
*(S->top++)=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
if(S->top==S->base) return ERROR;
e=--S->top;
return OK;
}
void Visite(struct tree *t)
{
if(t) printf("%c",t->data);
}
struct tree *create_btree(struct tree *t,struct tree *r,char data)//创建二叉树
{
if (r ==0 )
{
r=new (struct tree);
if ( r == 0)
{
printf("Out of memory/n"); return 0 ;
}
r->Lchild= 0; r->Rchild=0; r->data=data;
if (t)
{
if(data<t->data) t->Lchild=r;
else
t->Rchild=r;
}
else
{
r->Rchild=0; r->Lchild = 0;
}
return r;
}
if(data<r->data)
create_btree(r,r->Lchild,data);
else
create_btree(r,r->Rchild,data);
return t;
}
void PreOrderUnrec(struct tree *t,SqStack *s)//前序遍历二叉树
{
InitStack(&s);
struct tree *p,*q;
p=t;
while (p!=0||!StackEmpty(*s))
{
while (p!=0) //遍历左子树
{
Visite(p);
if((p->Lchild==0||p->Rchild==0)&&(p->Lchild!=p->Rchild))
{printf(" o ");
i++;};
Push(s,*p);
p=p->Lchild;
};//endwhile
while (!StackEmpty(*s)) //通过下一次循环中的内嵌while实现右子树遍历
{
Pop(s,p);
q=s->top;
//Pop(s,p);
p=q->Rchild;
Visite(p);
printf("?");
};//endif
};//endwhile
}//PreOrderUnrec
void main()
{
char s[100], e;
SqStack *Sa;
struct tree *t=0;
printf("Input a letter for Creating the Binary_Tree ( Directly press <Enter> to stop ):/n");
while (*s){
printf("/nInput a letter: ");
e=getch(); /*#include<conio.h>*/
putch(e); /*#include<conio.h>*/
if(e==13) break;
if (!t)
t=create_btree(t,t,e);
else
create_btree(t,t,e);
};
printf("/n");
PreOrderUnrec(t,Sa);
printf("度数为一的结点数为:%d",i);
printf("结束请按q!");
if(getchar()=='q') printf("再见");
else {while(1);};
}
分享到:
相关推荐
求度为2的节点数量,也就是具有两个子节点的节点数,同样可以通过遍历二叉树实现。在遍历过程中,检查每个节点的子节点数量,如果一个节点有且只有两个子节点,那么计数器加1。 在实际操作中,我们可能需要编写代码...
6.设森林 F 对应的二叉树为 B,它有 m 个结点,B 的根为 p,p 的右子树结点个数为 n,森林 F 中第一棵树的结点个数是( )。 在这里,我们可以根据森林 F 的定义,得到第一棵树的结点个数为 m-n。 7.树是结点...
二叉树可以为空,或者由一个根节点以及两棵(可能为空)分别称为左子树和右子树的二叉树组成。 节点的度是节点子树的数量,即一个节点的子节点个数。在二叉树中,节点的度可以是0(叶节点,没有子节点),1(只有一...
只有一个结点的二叉树的度为0;二叉树的度为2;二叉树的左右子树可任意交换;深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。 5. 森林和二叉树: 设森林F对应的二叉树为B,它有m个结点,B的根为p,p...
3. 在任意一棵二叉树中,度数为 0 的结点(即叶子结点)总比度为 2 的结点多一个。 4. 具有 n 个结点的二叉树,其深度至少为 ⌈log2(n+1)⌉,其中 ⌈x⌉ 表示取 x 的整数部分。 满二叉树是除最后一层外,每一层上的...
二叉链表的结点形式如下:data 域:称为数据域,用于存储二叉树结点中的数据元素,lchild 域:称为左孩子指针域,用于存放指向本结点左孩子的指针(左指针),rchild 域:称为右孩子指针域,用于存放指向本结点右...
树是一种数据结构,由一个根节点和零个或多个子树组成。二叉树是一种特殊的树,其中每个节点最多有两个子节点。树和二叉树都是计算机科学中常用的数据结构。 二、树和二叉树的性质 树和二叉树都有其特定的性质,...
8. **图的性质**:在一个无向图中,所有顶点的度数之和等于边数的2倍,这是因为每条边连接两个顶点,所以每条边对度数的贡献是2。 9. **链队列操作**:链队列的删除操作是将队头指针f指向下一个节点;插入操作是将...
10. 度为特定值的结点数与树的形态:对于一个给定度数的结点数,可以推算出树中叶子结点的个数。例如,一个四叉树中度为2的结点数为2,度为3的结点数为3,度为4的结点数为4,可以通过建立方程组来求解叶子结点的数量...
这个性质可以从二叉树结点度数的总和来证明。二叉树中所有结点的度数之和等于0度结点数、1度结点数和2度结点数的和,即n=no+n1+n2。同时,从子结点的角度看,1度结点贡献了n1个子结点,2度结点贡献了2n2个子结点,...
完全二叉树中,除了最后一个层次,其他层的结点度数只能是2或0,最后一个层次的结点度数可以是2、1或0。 9. **二叉树的深度**: - 二叉树的最大深度由结点数n决定,最深的树形状是一条链,深度为n-1。最小深度是1...
2. 从优先队列中取出两个最小频率的结点,并将它们合并成一个新的内部结点,新结点的频率为其两个子结点的频率之和。 3. 将新结点重新加入优先队列。 4. 重复步骤2和步骤3,直到优先队列中只剩下一个结点,这个结点...
* 性质5:对于具有n个结点的完全二叉树,如果按照从上至下和从左到右的顺序对二叉树中的所有结点从1开始顺序编号,则对于任意的序号为i的结点,有:(1)如果i>1,则序号为i的结点的双亲结点的序号为i/2(“/”表示...
在提供的代码中,定义了一个二叉树节点结构体`BiTNode`,包含数据域和指向左右子节点的指针。同时,定义了顺序栈和循环队列的数据类型,用于处理二叉树节点,表明在实际编程中,这些数据结构和算法是处理树问题的...
1、二叉树结点的实现:以 class 类创建树的单个结点,节点中应包含当前节点的值、左节点指针、右节点指针 2、二叉树的创建:空的二叉树:用队列操作来实现二叉树;创建二叉搜索树 3、二叉的遍历: 递归算法: ...
1. 二叉树是由一个或多个结点组成的有限集合,其中必有一个特定的称为根(ROOT)的结点。 2. 剩下的结点被分成 n>=0 个互不相交的集合 T1、T2、......Tn,而且,这些集合的每一个又都是树。 3. 树 T1、T2、......Tn 被...
首先,树被定义为一个有限集合,其中包含一个特殊的根节点以及可能的子树集合。每个子树本身也是一个树,这种定义具有递归性。在树的结构中,除了根节点,其他节点都有且仅有一个父节点,而节点可以有零个或多个子...
二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:空二叉树、只有一个根结点的二叉树、右子树为空的二叉树、左子树为空的二叉树和完全二叉树。 二叉树的性质 二叉树有许多重要的性质,如...
三角矩阵中的重复元素c可共享一个存储空间,其余的元素正好有n×(n+1)/2个,因此,三角矩阵可压缩到向量Sa[0……n×(n+1)/2]中,其中c存放在向量的最后一个分量中。用向量Sa[0……n×(n+1)/2]压缩存储下三角矩阵,...
* 一个结点的度数至多为 2。 * 左子树和右子树有左右之分,且次序不能颠倒。 二叉树的基本特征: * 每个结点最多只有两棵子树(不存在度大于 2 的结点) * 左子树和右子树有左右之分,且次序不能颠倒。 二叉树的 ...