考研复习(7)树的基本操作
来源:互联网 发布:苹果手机怎么开数据 编辑:程序博客网 时间:2024/06/12 13:27
这次是树的基本操作,包括生成树,求树深度,求叶子节点个数。。。
附上二叉树的几个重要性质及证明(考研必考)。
1.在二叉树的第i层至多有2^(i-1)个结点;
2.深度为k的二叉树至多有2^(k)-1 个结点;
3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1;(n=n0+n1+n2=n1+2n2+1);
4.具有n哥节点的完全二叉树深度为【log2n】+1;
附上二叉树的几个重要性质及证明(考研必考)。
1.在二叉树的第i层至多有2^(i-1)个结点;
2.深度为k的二叉树至多有2^(k)-1 个结点;
3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1;(n=n0+n1+n2=n1+2n2+1);
4.具有n哥节点的完全二叉树深度为【log2n】+1;
#include <stdio.h>#include<stdlib.h>#define maxSize 20#define maxWidth 20typedef struct node{char data;struct node *left,*right;}Btree;Btree* createNode(char ch,Btree *l,Btree *r);//先序遍历void preOrder(Btree *BT){if(BT!= NULL){printf("%c",BT->data);preOrder(BT->left);preOrder(BT->right);}}//中序遍历void inOrder(Btree *BT){if(BT!= NULL){ inOrder(BT->left);printf("%c",BT->data);inOrder(BT->right);}}//后序遍历void postOrder(Btree *BT){if(BT!= NULL){ postOrder(BT->left);postOrder(BT->right);printf("%c",BT->data);}}//从括号表达式生成树void createTree(Btree **BT,char *str)//create a tree BT according by hollow function str{ Btree *stack[maxSize],*p; int top=-1,k,j=0;//top is the point of stack,k is the tab of son,j is the point of str; char ch; *BT=NULL; ch=str[j]; while(ch!=NULL) { switch(ch) { case'(':top++;stack[top]=p;k=1;//left son,push to stack break; case')':top--;//pop stack break; case ',':k=2;//right son break; default: /*p=(Btree *)malloc(sizeof(Btree));//set a node if(!(p)) { exit(0); } p->data=ch; p->left=p->right=NULL;*/ p=createNode(ch,NULL,NULL); if(*BT==NULL)//the root node { *BT=p; } else { switch(k) { case 1:stack[top]->left=p; break; case 2:stack[top]->right=p; break; default: ; } } } j++; ch=str[j];//get next char }}/*void createTree(Btree **BT,char *str){ int j=0;//top is the point of stack,k is the tab of son,j is the point of str; Btree *T; char ch; ch=str[j]; if(ch=='') *BT=NULL; else { if(!(T=)) }}*///生成节点Btree* createNode(char ch,Btree *l,Btree *r){ printf("Create now!\n"); Btree *p; p=(Btree *)malloc(sizeof(Btree));//set a node if(!(p)) { exit(0); } p->data=ch; p->left=l; p->right=r; return p;}//复制树//copy a tree and return the new tree's pointBtree* copyTree(Btree *T){ Btree *newptl,*newptr,*newT; if(!T) return NULL; if(T->left!=NULL) { newptl=copyTree(T->left); } else newptl=NULL; if(T->right!=NULL) newptr=copyTree(T->right); else newptr=NULL; newT=createNode(T->data,newptl,newptr); //newT=createNode(T->data,NULL,NULL); //newT=NULL; return newT;}//层次法打印树void disptree(Btree *BT){ Btree *stack[maxSize],*p; int level[maxSize][2],top,n,i,width=4; if(BT!=NULL) { printf("Display a tree by hollow means.\n"); top=1; stack[top]=BT;//push root point to stack. level[top][0]=width; while(top>0) { p=stack[top]; n=level[top][0]; for(i=1;i<=n;i++) printf(" "); printf("%c",p->data); for(i=n+1;i<maxWidth;i+=2) printf("--"); printf("\n"); top--; if(p->right!=NULL) { top++; stack[top]=p->right; level[top][0]=n+width; level[top][1]=2; } if(p->left!=NULL) { top++; stack[top]=p->left; level[top][0]=n+width; level[top][1]=1; } } }}int TreeDepth(Btree *BT)//calculate the depth of tree{ int leftDep,rightDep; if(BT==NULL) return 0; else { leftDep=TreeDepth(BT->left); rightDep=TreeDepth(BT->right); if(leftDep>rightDep) return(leftDep+1); else return (rightDep+1); }}int NodeCount(Btree *BT)//cout the nodes{ if(BT==NULL) return 0; else return (NodeCount(BT->left)+NodeCount(BT->right)+1);}int LeafCount(Btree *BT)//count the leafnodes{ if(BT==NULL) return 0; else if(BT->left==NULL&&BT->right==NULL) return 1; else return (LeafCount(BT->left)+LeafCount(BT->right));}void PrintTree(Btree *BT)//print tree{ if(BT!=NULL) { printf("%c",BT->data); if(BT->left!=NULL||BT->right!=NULL) { printf("("); PrintTree(BT->left); if(BT->right!=NULL) printf(","); PrintTree(BT->right); printf(")"); } }}main(){ Btree *B,*C; char *s="A(B(D,E(H,I)),C(G))"; createTree(&B,s); printf("preOder:"); preOrder(B); printf("\n"); printf("inOder:"); inOrder(B); printf("\n"); printf("postOder:"); postOrder(B); printf("\n"); printf("Display tree\n"); disptree(B); printf("copy tree\n"); //disptree(B); C=copyTree(B); preOrder(C); disptree(C); printf("Deep: %d\n",TreeDepth(B)); printf("Sum of nodes: %d\n",NodeCount(B)); printf("Sum of leafnodes: %d\n",LeafCount(B)); PrintTree(B);printf("\nHello,world!");}
- 考研复习(7)树的基本操作
- 考研复习(8)-图的基本操作
- 考研复习(2)链表操作
- 考研复习(4)-栈操作
- 考研复习(5)-队列操作
- 考研复习(9)-图的应用
- 考研的复习生活
- 考研复习(一)
- 考研复习(3)链表操作续
- 数据结构复习——二叉树的几个基本操作
- 数据结构复习整理——二叉树的基本操作
- 新生情节(酸楚), 复习了数据库的基本操作
- Linux复习笔记(一) -- Bash的基本操作
- 最省钱的考研复习
- 复习一下栈的基本操作
- 考研的数学复习经验(感谢考研论坛供贴)
- (复习)数据库连接及基本操作
- mysql 基本操作快速复习(三)
- XML的序列化和反序列化
- 查看文章 【MFC】单选按钮
- 学习技术也是学习一种思维方式
- 无线照明系统开发过程说明(四)
- 计算中unsigned与signed的区别
- 考研复习(7)树的基本操作
- android 广播大全
- 服务器托管常见问题纠纷与解决方法
- Android 开发笔记
- 全国城市数据库录入sql语句
- Rails Rake指南
- Cow Pedigrees
- sftp 使用方法
- PHPUnit安装