文档章节

二叉树的性质以及二叉树的遍历(非递归)(c语言)(一)

奔跑的码农
 奔跑的码农
发布于 2016/05/14 15:37
字数 897
阅读 296
收藏 7

二叉树的性质:

性质 1 在二叉树的第i层上至多有2^(i-1)个结点(i>=1)。

性质 2 深度为k的二叉树至多有2^k-1个结点,(k>=1)。

性质 3 任何一颗二叉树,终端结点为n0,度为2的结点为n2,那么n0=n2+1。

性质 4  具有n个结点的完全二叉树的深度为└㏒2 n┘+1。

性质 5 完全二叉树按层次从上到下从左到右依次编号。编号为n的节点的左孩子为2n。

二叉树的储存结构

lchild data rchild
/*---------二叉树的二叉链表储存表示----------*/
typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode ,*BiTree;

非递归遍历需要栈:栈的实现过程:栈的线性储存结构与链式储存结构的实现(C语言)

栈部分的内容:

typedef BiTree pElemType;
typedef struct Snode //栈的储存结构 
{
    pElemType data;	//数据域 

    struct Snode *next; //指针域 
}Snode,*LinkStack;
void Init_StackL(LinkStack *S)	//初始化院栈 
{
    *S=NULL;
}
Status Push_L(LinkStack *S,pElemType x) 	//压栈 
{
    LinkStack p;
    p=(LinkStack)malloc(sizeof(Snode)); 
    p->data=x;

    p->next=*S;

    *S=p;
    return 1;
}
Status Pop_L(LinkStack *S,pElemType *temp_) //出栈 
{
    LinkStack p;
    pElemType temp;
    if(*S==NULL) return 0;

    temp=(*S)->data;

    p=*S;

    *S=p->next;
    free(p);

    *temp_=temp;
    return 1;
}
Status StackEmpty(LinkStack *S) 	//判断栈顶是否为空 如果为空返回 0 
{
    if(*S==NULL) return 0;

    else
        return 1;
}

以下为二叉树部分:

Status CreateBiTree(BiTNode **T)	//先序生成二叉树 
{
    int ch;

    scanf("%d",&ch);
    if(ch==0) *T=NULL;
    else{
        if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))exit(0);
        (*T)->data=ch;
        CreateBiTree(&(*T)->lchild);
    
        CreateBiTree(&(*T)->rchild);
    }
    return 1;
}
}
Status preOrderTraverse(BiTNode *T)//前序遍历二叉树,并统计总结点 
{
	int i=0;
    LinkStack S;
    BiTNode *p;
    p=T;
    Init_StackL(&S);
    while(p||StackEmpty(&S)){//StackEmpty(&S)判断栈顶是否为空 如果为空返回 0 
        if(p){
            Push_L(&S,p);
      		     printf("%d\t",p->data);
      		     i++;
            p=p->lchild; 

        }
        else{
            Pop_L(&S,&p);
 
            if(!(p->data)) return 0;
       
            p=p->rchild;
        }
    }
  //  return 1;
	printf("\n所有生成节点的总数为:%d\n",i);//总结点	
} 
Status InOrderTraverse(BiTNode *T)	//中序遍历二叉树 
{

    LinkStack S;
    BiTNode *p;
    p=T;
    Init_StackL(&S);
    while(p||StackEmpty(&S)){//StackEmpty(&S)判断栈顶是否为空 如果为空返回 0 
        if(p){
            Push_L(&S,p);
      
            p=p->lchild; 

        }
        else{
            Pop_L(&S,&p);
 
            if(!(p->data)) return 0;
            printf("%d\t",p->data);
            p=p->rchild;
        }
    }
    return 1;
}
void postorder(BiTNode *T)//用递归的方法后续遍历二叉树 
{
	if(T!=NULL)
	{
		postorder(T->lchild);
		postorder(T->rchild);
		printf("%d\t",T->data);
	}
}

以下为测试函数,先序生成二叉树:如果为结点空则输入 0。

我们输入的数据为:1 2 4 0 0 5 0 0 3 0 0 ;

void main()
{
    BiTNode *T;
        printf("请按如下图案先序生成链表,0代表为空:\n");
	printf("        ①\n");
	printf("      ╱   ╲\n");
	printf("    ②       ③ \n");
	printf("  ╱   ╲\n");
	printf("④       ⑤ \n");
	printf("输入的数字是1 2 4 0 0 5 0 0 3 0 0 "); 
    CreateBiTree(&T);
   	printf("        ①\n");
	printf("      ╱   ╲\n");
	printf("    ②       ③ \n");
	printf("  ╱   ╲\n");
	printf("④       ⑤ \n");
   	printf("中序遍历二叉树的结果为:");
    InOrderTraverse(T);
	printf("\n后续遍历二叉树的结果为:");
    postorder(T);//用递归的方法后续遍历二叉树 
   	printf("\n前序遍历二叉树的结果为: ");
   	preOrderTraverse(T);
   	printf("\n");
}

程序运行的结果为:

正在加载图片


学习数据结构记录,如有错误欢迎指正。

参考书:数据结构 c语言版

© 著作权归作者所有

共有 人打赏支持
奔跑的码农

奔跑的码农

粉丝 15
博文 28
码字总数 34430
作品 0
海淀
程序员
私信 提问
数据结构-二叉树的存储结构与遍历

定义 一个有穷的结点集合,可以为空。若不为空,则它是由根结点和称为其左子树和右子树的两个互不相交的二叉树组成。 二叉树的五种基本形态: tree_state 二叉树的子树是有顺序之分的,称为左...

IAM四十二
2017/10/24
0
0
数据结构分析之二叉树

概述 在分析树形结构之前,先看一下树形结构在整个数据结构中的位置 数据结构 当然,没有图,现在还没有足够的水平去分析图这种太复杂的数据结构,表数据结构包含线性表跟链表,也就是经常说...

wustor
2017/11/06
0
0
[算法总结] 20 道题搞定 BAT 面试——二叉树

本文首发于我的个人博客:尾尾部落 0. 几个概念 完全二叉树:若二叉树的高度是h,除第h层之外,其他(1h-1)层的节点数都达到了最大个数,并且第h层的节点都连续的集中在最左边。想到点什么没...

繁著
09/04
0
0
python环境下使用mysql数据及数据结构和二叉树算法(图)

python环境下使用mysql数据及数据结构和二叉树算法(图): 1 python环境下使用mysql 2使用的是 pymysql库 3 开始-->创建connection-->获取cursor-->操作-->关闭cursor->关闭connection->结束......

原创小博客
08/26
0
0
数据结构之树

数据结构之树 目录: 二叉树的结构 二叉树的性质 二叉树的遍历 二叉树的特例 二叉树典型程序 树是一种编程中常常用到的一种数据结构,它的逻辑是:除了根结点之外每个结点只有一个父结点,根...

花开半夏qb
2016/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
34分钟前
1
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
3
0
3分钟总结Mybatis别名

1.系统内置别名: 把类型全小写(resultType/paramType) 2.给某个类起别名 2.1 alias=”自定义” <typeAliases> <typeAlias type="com.bjsxt.pojo.People" alias="peo"/> </typeAli......

KingFightingAn
昨天
2
0
JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
昨天
8
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部