文档章节

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

奔跑的码农
 奔跑的码农
发布于 2016/05/14 15:37
字数 897
阅读 261
收藏 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语言版

© 著作权归作者所有

共有 人打赏支持
奔跑的码农
粉丝 11
博文 25
码字总数 28867
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

xilinx资源

本系列教学视频由赛灵思高级战略应用工程师带领你:从零开始,一步步深入 掌握 HLS 以及 UltraFAST 设计方法,帮助您成为系统设计和算法加速的大拿! http://www.eetrend.com/topics/2018-0...

whoisliang
5分钟前
0
0
=====BJmeter性能测试小接=====

一、性能测试分类 1、负载测试: 通过逐步加压的方法,达到既定的性能阈值的目标,阈值的设定应是小于某个值,如cpu使用率小于等于80% 2、压力测试: 通过逐步加压的方法,使得系统的某些资源...

覃光林
9分钟前
0
0
企业级开源四层负载均衡解决方案--LVS

网盘链接 企业级开源四层负载均衡解决方案--LVS 本课程将在Linux环境下,学习配置使用LVS,对Web集群和MySQL集群进行负载均衡,并结合利用Keepalived实现负载均衡器的高可用,实现对后端Rea...

qq__2304636824
14分钟前
0
0
Windows上安装Spacemacs

emacs安装 下载地址emacs 安装比较简单,解压后执行\bin\addpm.exe即可 emacs配置 emacs的默认配置文件路径和.emacs.d文件夹都是在Windows主目录下的 C:\Users\Administrator\AppData\Roami...

yxmsw2007
30分钟前
0
0
OSChina 周一乱弹 —— 鱼生不值得

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念:分享新裤子的单曲《没有理想的人不伤心 (Remix版)》: 《没有理想的人不伤心 (Remix版)》- 新裤子 手机党少年们想听歌,请使劲儿戳...

小小编辑
今天
171
9

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部