文档章节

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

奔跑的码农
 奔跑的码农
发布于 2016/05/14 15:37
字数 897
阅读 253
收藏 7
点赞 2
评论 0

二叉树的性质:

性质 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
数据结构之树

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

花开半夏qb
2016/11/29
0
0
Leetcode——二叉树常考算法整理

二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路。也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 前言 二叉树即...

qq_32690999
05/28
0
0
经典算法学习——非递归遍历二叉树

我们知道二叉树是一种递归定义的数据结构,包括二叉树的创建、遍历、求树高、叶子节点个数等等。使用递归来进行以上操作非常的简便,相关实现请参考 《C语言实现二叉树的基本操作》。但是今天...

chenyufeng1991
2016/10/03
0
0
二叉树的遍历,深度优先遍历和广度优先遍历

原文:http://www.cnblogs.com/joyang/p/4860441.html 二叉树的遍历: D:访问根结点,L:遍历根结点的左子树,R:遍历根结点的右子树。 给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一...

not_in_mountain
2017/09/29
0
0
数据结构学习笔记(树、二叉树)

                       树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)...

希希里之海
2017/05/15
0
0
二叉树简单操作(下)

一、二叉树基本操作  1. 求二叉树的深度。(树的深度:树中所有节点的层次的最大值称为该树的深度)  2. 求二叉树叶子结点的个数。(叶子节点:度为0的结点称为叶结点,叶节点也称为终端节点...

qq_38646470
01/22
0
0
二叉树知识点回忆以及整理

二叉树 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”,左子树和右子树同时也是二叉树。二叉树的子树有左右之分,并且次序不能任意颠倒。...

静默加载
2017/10/19
0
0
二叉树创建与遍历,递归和非递归实现

title: 二叉树最大的权值和 date: 2017-09-16 09:32:32 category: 默认分类 本文介绍 二叉树最大的权值和 二叉树最大的权值和 本文由在当地较为英俊的男子金天大神原创,版权所有,欢迎转载,...

Nicholas_Jela
2017/09/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
0
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
0
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
2
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
0
0
gin endless 热重启

r := gin.New()r.GET("/", func(c *gin.Context) {c.String(200, config.Config.Server.AppId)})s := endless.NewServer(":8080", r)s.BeforeBegin = func(add string) ......

李琼涛
昨天
0
0
JAVA模式之代理模式

平时一直在用spring,spring中最大的特效IOC和AOP,其中AOP使用的就是代理模式.闲着无聊,随手写了一个代理模式,也记录下代理模式的实现Demo. 比如现在有一个场景是:客户想要增加一个新的功能,...

勤奋的蚂蚁
昨天
0
0
ES15-JAVA API 索引管理

1.创建连接 创建连接demo package com.sean.esapi.client;import java.net.InetSocketAddress;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.clien......

贾峰uk
昨天
0
0
单点登录的设计,从单域名到多域名(经验分享)

个人实践总结,最初的的需求,多个产品线都在同一个根域名下面。 独立的用户中心分离,单独负责用户登录和用户信息获取、变更等处理逻辑。 第一步,用户登录成功,分配给用户一个memToken(令...

小海bug
昨天
0
0
合格前端第十二弹-TypeScript + 大型项目实战

写在前面 TypeScript 已经出来很久了,很多大公司很多大项目也都在使用它进行开发。上个月,我这边也正式跟进一个对集团的大型运维类项目。 项目要做的事情大致分为以下几个大模块 一站式管理...

qiangdada
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部