求c语言二叉树的建立每一层的节点数 C语言实现多谢大神了!给思路也可以,

1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读完全二叉树共有360结点,则在该二叉树中度为1的结点个数为 A1 B0 C 180 D181_百度作业帮
完全二叉树共有360结点,则在该二叉树中度为1的结点个数为 A1 B0 C 180 D181
完全二叉树中度为0的结点要么1个,要么0个,由于总结点数为偶数个,所以度为1的结点只有1个;度为2的结点为k,则度为0的结点为k+1,360-k-k-1一定是奇数求数据结构(C语言版)建立二叉树的代码~~急~~谢谢了
求数据结构(C语言版)建立二叉树的代码~~急~~谢谢了
建立一个二叉树:(1)输出其对应的中,先,后根序列(2)输出树中结点所在的层数(3)输出树中叶子数
二叉树具有以下重要性质:性质1二叉树第i层上的结点数目最多为2i-1(i≥1)。证明:用数学归纳法证明:归纳基础:i=1时,有2i-1=20=1。因为第1层上只有一个根结点,所以命题成立。归纳假设:假设对所有的j(1≤j&i)命题成立,即第j层上至多有2j-1个结点,证明j=i时命题亦成立。归纳步骤:根据归纳假设,第i-1层上至多有2i-2个结点。由于二叉树的每个结点至多有两个孩子,故第i层上的结点数至多是第i-1层上的最大结点数的2倍。即j=i时,该层上至多有2×2i-2=2i-1个结点,故命题成立。性质2深度为k的二叉树至多有2k-1个结点(k≥1)。证明:在具有相同深度的二叉树中,仅当每一层都含有最大结点数时,其树中结点数最多。因此利用性质1可得,深度为k的二叉树的结点数至多为:20+21+…+2k-1=2k-1故命题正确。性质3在任意-棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则no=n2+1。证明:因为二叉树中所有结点的度数均不大于2,所以结点总数(记为n)应等于0度结点数、1度结点(记为n1)和2度结点数之和:n=no+n1+n2(式子1)另一方面,1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总数是:nl+2n2树中只有根结点不是任何结点的孩子,故二叉树中的结点总数又可表示为:n=n1+2n2+1(式子2)由式子1和式子2得到:no=n2+1满二叉树和完全二叉树是二叉树的两种特殊情形。1、满二叉树(FullBinaryTree)一棵深度为k且有2k-1个结点的二又树称为满二叉树。满二叉树的特点:(1)每一层上的结点数都达到最大值。即对给定的高度,它是具有最多结点数的二叉树。(2)满二叉树中不存在度数为1的结点,每个分支结点均有两棵高度相同的子树,且树叶都在最下一层上。【例】图(a)是一个深度为4的满二叉树。2、完全二叉树(CompleteBinaryTree)若一棵二叉树至多只有最下面的两层上结点的度数可以小于2,并且最下一层上的结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。特点:(1)满二叉树是完全二叉树,完全二叉树不一定是满二叉树。(2)在满二叉树的最下一层上,从最右边开始连续删去若干结点后得到的二叉树仍然是一棵完全二叉树。(3)在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。【例】如图(c)中,结点F没有左孩子而有右孩子L,故它不是一棵完全二叉树。【例】图(b)是一棵完全二叉树。性质4具有n个结点的完全二叉树的深度为证明:设所求完全二叉树的深度为k。由完全二叉树定义可得:深度为k得完全二叉树的前k-1层是深度为k-1的满二叉树,一共有2k-1-1个结点。由于完全二叉树深度为k,故第k层上还有若干个结点,因此该完全二叉树的结点个数:n&2k-1-1。另一方面,由性质2可得:n≤2k-1,即:2k-1-l&n≤2k-1由此可推出:2k-1≤n&2k,取对数后有:k-1≤lgn&k又因k-1和k是相邻的两个整数,故有,由此即得:注意:的证明【参见参考书目】回答者:杰清-经理五级1-1609:35前序遍历voidpreorder(btree*p){if(p!=NULL){printf("%d",p-&data);preorder(p-&left);preorder(p-&right);}}中序遍历voidinorder(btree*p){if(p!=NULL){inorder(p-&left);printf("%d",p-&data);inorder(p-&right);}}后序遍历voidpostorder(btree*p){if(p!=NULL){postorder(p-&left);postorder(p-&right);printf("%d",p-&data);}}#include&stdio.h&#include&iostream&#include&queue&#include&stack&#include&malloc.h&#defineSIZE100typedefstructBiTNode//定义二叉树节点结构{//数据域structBiTNode*lchild,*//左右孩子指针域}BiTNode,*BiTintvisit(BiTreet);voidCreateBiTree(BiTree&T);//生成一个二叉树voidPreOrder(BiTree);//递归先序遍历二叉树voidInOrder(BiTree);//递归中序遍历二叉树voidPostOrder(BiTree);//递归后序遍历二叉树voidInOrderTraverse(BiTreeT);//非递归中序遍历二叉树voidPreOrder_Nonrecursive(BiTreeT);//非递归先序遍历二叉树voidLeverTraverse(BiTreeT);//非递归层序遍历二叉树//主函数voidmain(){BiTreeT;intflag=1;//---------------------程序解说-----------------------printf("本程序实现二叉树的操作。\n");printf("叶子结点以空格表示。\n");printf("可以进行建立二叉树,递归先序、中序、后序遍历,非递归先序、中序遍历及非递归层序遍历等操作。\n");//----------------------------------------------------printf("\n");printf("请建立二叉树。\n");printf("建树将以三个空格后回车结束。\n");printf("例如:123456(回车)\n");CreateBiTree(T);//初始化队列getchar();while(flag){printf("\n");printf("请选择:\n");printf("1.递归先序遍历\n");printf("2.递归中序遍历\n");printf("3.递归后序遍历\n");printf("4.非递归中序遍历\n");printf("5.非递归先序遍历\n");printf("6.非递归层序遍历\n");printf("0.退出程序\n");scanf("%c",&j);switch(j){case'1':if(T){printf("递归先序遍历二叉树:");PreOrder(T);printf("\n");}elseprintf("二叉树为空!\n");case'2':if(T){printf("递归中序遍历二叉树:");InOrder(T);printf("\n");}elseprintf("二叉树为空!\n");case'3':if(T){printf("递归后序遍历二叉树:");PostOrder(T);printf("\n");}elseprintf("二叉树为空!\n");case'4':if(T){printf("非递归中序遍历二叉树:");InOrderTraverse(T);printf("\n");}elseprintf("二叉树为空!\n");case'5':if(T){printf("非递归先序遍历二叉树:");PreOrder_Nonrecursive(T);printf("\n");}elseprintf("二叉树为空!\n");case'6':if(T){printf("非递归层序遍历二叉树:");LeverTraverse(T);printf("\n");}elseprintf("二叉树为空!\n");default:flag=0;printf("程序运行结束,按任意键退出!\n");}}}//建立二叉树voidCreateBiTree(BiTree&T){scanf("%c",&ch);//读入一个字符if(ch=='')T=NULL;else{T=(BiTNode*)malloc(sizeof(BiTNode));//生成一个新结点T-&data=CreateBiTree(T-&lchild);//生成左子树CreateBiTree(T-&rchild);//生成右子树}}//先序遍历的递归voidPreOrder(BiTreeT){if(T){printf("%c",T-&data);//访问结点PreOrder(T-&lchild);//遍历左子树PreOrder(T-&rchild);//遍历右子树}}//中序遍历的递归voidInOrder(BiTreeT){if(T){InOrder(T-&lchild);//遍历左子树printf("%c",T-&data);//访问结点InOrder(T-&rchild);//遍历右子树}}//后序遍历的递归voidPostOrder(BiTreeT){if(T){PostOrder(T-&lchild);//遍历左子树PostOrder(T-&rchild);//访问结点printf("%c",T-&data);//遍历右子树}}//非递归中序遍历voidInOrderTraverse(BiTreeT){stack&BiTree&S;BiTS.push(T);//跟指针进栈while(!S.empty()){p=newBiTNwhile((p=S.top())&&p)S.push(p-&lchild);//向左走到尽头S.pop();//空指针退栈if(!S.empty()){p=S.top();S.pop();cout&&p-&data&&"";S.push(p-&rchild);}}}//先序遍历的非递归voidPreOrder_Nonrecursive(BiTreeT){stack&BiTree&S;BiTS.push(T);//根指针进栈while(!S.empty())//栈空时结束{while((p=S.top())&&p){cout&&p-&data&&"";S.push(p-&lchild);}//向左走到尽头S.pop();//弹出堆栈if(!S.empty()){p=S.top();S.pop();S.push(p-&rchild);//向右走一步}}}voidLeverTraverse(BiTreeT){//非递归层次遍历queue&BiTree&Q;BiTp=T;if(visit(p)==1)Q.push(p);while(!Q.empty()){p=Q.front();Q.pop();if(visit(p-&lchild)==1)Q.push(p-&lchild);if(visit(p-&rchild)==1)Q.push(p-&rchild);}}intvisit(BiTreeT){if(T){printf("%c",T-&data);return1;}elsereturn0;}
相关知识等待您来回答
编程领域专家当前位置: >
> 很简单的题,真的。给一棵二叉树,证明一定可以把它的节点分成三个部分A,B,C使得每一对父子节点在不
很简单的题,真的。给一棵二叉树,证明一定可以把它的节点分成三个部分A,B,C使得每一对父子节点在不
sunyoubei & at
很简单的题,真的。给一棵二叉树,证明一定可以把它的节点分成三个部分A,B,C使得每一对父子节点在不同的集合中,并使得max{|A|,|B|,|C|}-min{|A|,|B|,|C|}≤1
归纳法证明
1)对节点个数为1的二叉树&&显然结论成立。
2)假设对节点为n的二叉树&&&结论成立即存在A,B,C的划分使得:max{sunyq64 & &
& & (0)(0)}-min{sunyu515 & &
& & (0)(0)}≤1
现在考察节点为n+1二叉树。因为节点为n+1的二叉树。去掉其根节点后,可形成左右两个二叉树+root节点。我们命名左树伟&l_tree&&右树伟r_tree。同时左右数的节点都&=&n&因此
左树可划分三个集合A1,B1,C1:&max{sunyu0073073 & &
& & (0)(0)A1sunyuan & &
& & (0)(0)B1sunyt0726 & &
& & (0)(0)C1sunyu130 & &
& & (0)(0)}-min{sunyt0726 & &
& & (0)(0)A1sunyt0726 & &
& & (0)(0),sunyq64 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-谁知道以二叉链表作存储结构设计按层次顺序同一层自左向右遍历二叉树的算法?(用C语言描素)
谁知道以二叉链表作存储结构设计按层次顺序同一层自左向右遍历二叉树的算法? (用C语言描素)
09-11-19 & 发布
//C++实现#include &stdio.h& #include &stdlib.h& #define ERROR -1 #define OK 1 typedef char TElemT
typedef struct BiTNode{ TElemT struct BiTNode *lchild,* }BiTNode,*BiT status CreateBiTree(BiTree &T); void PreOrderTraverse(BiTree T,void (*visit)(TElemType e)); void PrintElem(TElemType e); void main(){ BiTree T; printf(&Enter the creat tree TElemType:&); CreateBiTree(T); //建立二叉树 输入数据 比如:ABC##D##E## printf(&The tree is :\n&); PreOrderTraverse(T,PrintElem); //先序遍历 (函数指针) printf(&\n&); } status CreateBiTree(BiTree &T){ //先序递归 建立二叉树 TElemT scanf(&%c&,&ch); if(ch==&#39;#&#39;) T=NULL; else{ T=(BiTNode*)malloc(sizeof(BiTNode)); T-&data = CreateBiTree(T-&lchild ); CreateBiTree(T-&rcgild ); } return OK; } void PreOrderTraverse(BiTree T,void (*visit)(TElemType e)){ //递归遍历 if(T){ visit(T-&data ); PreOrderTraverse(T-&lchild,visit ); PreOrderTraverse(T-&rcgild,visit ); } } void PrintElem(TElemType e){ //输出 数的结点 printf(&%c &,e); }
请登录后再发表评论!
只要在遍历右子树之前加上判断统计就可以了,下面给出一个Vc的程序例子,包括建树、遍历等等,下面先序建立一棵树abcd, 输入(输入一个字符回车一次): a b # # c # d # # 输出;中序遍历结果和叶子节点数 实现程序如下: #include&iostream.h& #include&stdio.h& #include&stdlib.h& typedef int S //----二叉树----- typedef char TElemT //元素类型为字符类型 typedef struct BiTNode{ TElemT struct BiTNode *lchild, * //左右孩子指针 }BiTNode, *BiT int NUM=0; //------基本操作的函数 Status InitBitTree(BiTree &T) //构造一个空二叉树T { T=new BiTN if(!T){ cout&&构造空树时出错&&} T-&data =NULL; T-&lchild =NULL; T-&rchild =NULL; }//InitBitTree Status CreateBiTree(BiTree &T) //构造一个二叉链表表示的二叉树T {
cout&&请输入结点的值(字符型,若空则用&#39;#&#39;): ; cin&& if(ch==&#39;#&#39;) T=NULL; else { //if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(1); T=new BiTN if(!T) exit(1); T-&data = //生成根结点 CreateBiTree(T-&lchild ); //构建左子树 CreateBiTree(T-&rchild ); //构建右子树 } return 0; } //CreateBiTree Status Visit(TElemType e) //对结点的操作函数 { cout&&e; return &#39; &#39;; } void InOrderTraverse(BiTree T,Status (*visit)(TElemType )) //中序遍历T,对每个结点调用函数Visit一次且仅一次,一旦失败,则操作失败 { if(T) //若二叉树不为空 { InOrderTraverse(T-&lchild, visit); //递归调用访问左子树 visit(T-&data ); //访问根结点, if(T-&rchild==NULL) NUM++; InOrderTraverse(T-&rchild ,visit); //递归调用访问右子树 } } int main() { BiTree T; InitBitTree(T); CreateBiTree(T); cout&&中序遍历(打印); && InOrderTraverse(T,Visit); printf(叶子节点数:%d\n,NUM); cin.get(); //cin.get(); return 0;
请登录后再发表评论!

我要回帖

更多关于 c语言删除节点 的文章

 

随机推荐