`
touchmm
  • 浏览: 1051120 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

考研复习(7)树的基本操作

 
阅读更多
这次是树的基本操作,包括生成树,求树深度,求叶子节点个数。。。
附上二叉树的几个重要性质及证明(考研必考)。
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 20
typedef 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 point
Btree* 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!");
}
分享到:
评论

相关推荐

    《数据结构》考研复习精编

    根据给定的信息,我们可以推断出这是一份针对《数据结构》科目的考研复习资料,由黄明编写。下面将详细解析《数据数据结构》考研复习精编中的关键知识点及复习策略。 ### 数据结构基本概念 #### 1. 数据结构定义 ...

    数据结构考研复习资料

    本复习资料旨在帮助考生全面理解和掌握数据结构的基础理论、基本概念和算法实现,为考试做好充分准备。 一、线性数据结构 线性数据结构包括数组、链表、栈和队列等。数组是一种静态存储结构,通过索引访问元素,...

    2018数据结构考研复习指导

    2018数据结构考研复习指导旨在帮助备考者系统、高效地复习这一关键领域,以便在考试中取得理想的成绩。 数据结构是研究数据的逻辑表示和物理存储,以及如何在这些数据上进行有效操作的一门学科。它不仅涵盖了基本的...

    数据结构考研复习精编

    ### 数据结构考研复习精编知识点概述 #### 一、线性表 **1.1 线性表的定义和基本操作** - **定义**:线性表是一种基本且重要的数据结构,它由一系列元素组成,这些元素按照一定的顺序排列,并且每个元素除了第一...

    计算机考研《数据结构》考研复习精编

    基本操作实现 - **插入**: 将一个新元素添加到数据结构中。 - **删除**: 从数据结构中移除一个元素。 - **查找**: 在数据结构中找到满足一定条件的元素。 - **排序**: 对数据结构中的元素按某种顺序进行排列。 - **...

    计算机考研数据结构复习指导Word版

    这份"计算机考研数据结构复习指导Word版"提供了一条有效的学习路径,帮助考生们精准定位并攻克这个领域的关键点。 复习指导文档《复习指导(数据结构部分).doc》可能涵盖了以下内容: 1. **基本概念**:数据结构...

    数据结构考研复习笔记

    "数据结构考研复习笔记" 数据结构是一门重要的计算机科学分支,它研究的是数据的存储、组织和处理等问题。武汉大学的数据结构复习笔记是对应清华大学出版社的书,详细记录了数据结构的基本概念、时间和空间复杂度的...

    南邮数据结构考研复习指导

    在南邮的考研复习中,不仅要理解和掌握这些基本概念,还要能够灵活运用它们来解决实际问题。同时,算法设计和分析能力也是考核的关键,包括时间复杂性和空间复杂性的分析,以及算法优化策略。 在复习过程中,建议多...

    计算机考研复习课件ppt

    计算机考研复习是一个全面而深入的过程,涉及到的知识点广泛且繁多。这个名为“计算机考研复习课件ppt”的压缩包文件,显然为考生提供了宝贵的复习资料。下面,我们将详细探讨其中可能涵盖的重要知识点。 首先,...

    数据结构考研复习ppt

    这份"数据结构考研复习ppt"包含了大量的知识点和详细讲解,不仅适用于考研复习,也适合于课堂教学。 首先,数据结构是关于如何在计算机中组织、存储和管理数据的学科。它研究的是数据的逻辑结构(如线性结构、树形...

    数据结构 考研复习笔记

    这份"数据结构考研复习笔记"是作者原创的复习资料,旨在帮助考生系统性地整理和复习数据结构的所有关键概念。 笔记内容可能涵盖以下几个方面: 1. **基本概念**:首先,会介绍数据结构的基本概念,如什么是数据、...

    考研数据结构复习指导

    在考研复习过程中,除了理解和掌握以上基础知识外,还要注重实践,通过编写代码来加深理解,同时要熟悉常见的面试题和经典算法题,提升分析和解决问题的能力。"数据结构考研指导"这份资料应涵盖这些知识点,并提供...

    计算机考研王道2019年数据结构考研复习指导.zip

    "计算机考研王道2019年数据结构考研复习指导"是一份专门为2020年考研学子量身打造的复习资料。这份资料在大纲发布之前,为考生提供了宝贵的复习资源,帮助他们提前准备,抢占先机。 数据结构是研究如何组织和管理...

    数据结构考研复习题数据结构考研复习题

    这份"数据结构考研复习题数据结构考研复习题"压缩包显然包含了大量针对考研的练习题目,旨在帮助考生巩固并深化对数据结构的理解。 首先,我们需要了解数据结构的基本概念,包括线性结构(如数组、链表、栈、队列)...

    操作系统考试考研复习课件-合肥工大

    总的来说,操作系统考研复习涵盖了操作系统的基本原理、设计方法和技术应用,要求考生具备深入理解并能够运用这些知识去分析和解决实际问题的能力。在准备考试时,考生需要全面复习这些知识点,并通过练习题和模拟...

    _数据结构_考研复习精编

    ### 数据结构考研复习精编——核心知识点概览 #### 数据结构基本概念 数据结构作为计算机科学的核心课程之一,主要研究如何有效地组织和存储数据,以便高效地访问和修改。其考研复习精编由黄明精心整理,旨在为考生...

Global site tag (gtag.js) - Google Analytics