二叉树构造、遍历和释放--自己写数据结构

直接上代码

bitree.h文件如下:

#ifndef _BITREE_H_
#define _BITREE_H_

typedef  char TElemType;

typedef struct _BitNode
{
    TElemType data;
    struct _BitNode *lchild,*rchild;
}BitNode,*pBitNode;

int bittree_creat(BitNode **T);
void pre_order(BitNode *T);
void mid_order(BitNode *T);
void post_order(BitNode *T);
#endif

bittree.c文件如下

/***************************
时间:2014.12.16
作者:XIAO_PING_PING
编译环境:DEV-C++ 4.9.9.2
内容:二叉树构造、遍历和释放
功能: 学习写数据结构 

****************************/
/********************************
(1)scanf("%c",&ch);和 scanf("%d",&ch);
的区别在于前者是一次性输入,后者需要输入数字后回车才能返回
(2)C语言指针作为函数的参数时,函数不能改变指针的值,
只能改变指针指向内容的值(只能用二级指针),C++可以通过*(&p)引用达到在函数内部
改变参数指针的值
(3)故也不可能实现将指针(包括结构体指针)作为函数参数,对其在
函数内部非配空间的任务(但是可以完成free操作),另外一种解决的办法是在函数内部初始化一个
指针后分配空间,然后用返回值的形式传递给外部指针
*********************************/
#include <string.h>
#include <stdio.h>

#include "bitree.h" 

/*创建二叉树*/
int bittree_creat(BitNode **T)//C语言函数内部不能改变作为参数的指针
{
     char ch;
     scanf("%c",&ch);

     //*T = *(T)->lchild ;
     if('0' == ch)
     {
         *T = NULL;
         return 0;
     }

     *T = (BitNode *)malloc(sizeof(BitNode));
     if(NULL == *T)
     {
         return -1;
     }
     (*T)->data = ch;

     bittree_creat(&((*T)->lchild));
     bittree_creat(&((*T)->rchild));       

     return 1;
}
/*前序遍历二叉树*/
void pre_order(BitNode *T)
{
    if(NULL == T)
    {
        return;
    }

    printf("%c ",T->data);
    pre_order(T->lchild);
    pre_order(T->rchild);
}
/*中序遍历二叉树*/
void mid_order(BitNode *T)
{
    if(NULL == T)
    {
        return;
    }

    mid_order(T->lchild);
    printf("%c ",T->data);
    mid_order(T->rchild);
}
/*后序遍历二叉树*/
void post_order(BitNode *T)
{
    if(NULL == T)
    {
        return;
    }

    post_order(T->lchild);
    post_order(T->rchild);
    printf("%c ",T->data);
}

/*释放二叉树*/
int free_btree(BitNode *T)
{
    if(NULL == T)
    {
        return 0;
    }      

    free_btree(T->lchild);
    free_btree(T->rchild);
    free(T); 

    return 1;
}

测试文件test.c如下:

/************************
*************************/
#include <string.h>
#include <stdio.h>
#include <conio.h>

#include "bitree.h"

int main()
{
    pBitNode btree;
    printf("Create binary tree:\n");
    bittree_creat(&btree);

    printf("\n前序:");
    pre_order(btree);
    printf("\n中序:");
    mid_order(btree);
    printf("\n后序:");
    post_order(btree);

    printf("\n销毁二叉树");
    free_btree(btree); 

    getch();
    return 0;
}

运行结果如下:

时间: 2024-10-30 03:51:11

二叉树构造、遍历和释放--自己写数据结构的相关文章

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

写了一个二叉树构造及中序遍历函数

本题就是测试读入数据的速度的. 如果有大量的数据读入,使用cin是很慢的. 那么使用scanf那么会快很多,但是如果数据量更大的话那么就还是不够快了. 所以这里使用fread. 首先开一个buffer,然后使用fread大块大块地读入数据就可以非常快地读入了. 题目如下: Input The input begins with two positive integers n k (n, k<=107). The next n lines of input contain one positive

数据结构二叉树构造及遍历详解

前言 最近学到了二叉树,就学着将二叉树构造,并尝试三种遍历操作.本次主要使用递归,回头会整理非递归的方法. 定义二叉树 1 typedef struct BinaryTree 2 { 3 TelemType data; 4 struct BinaryTree *lchild; 5 struct BinaryTree *rchild; 6 }*Node,node; 其中要注意Node是结构体指针,这样定义以后使用会方便很多. 构造二叉树 1 Node CreatTree() 2 { 3 Node

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

一步一步写算法(之二叉树广度遍历)

原文:一步一步写算法(之二叉树广度遍历) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在二叉树的遍历当中,有一种遍历方法是不常见的,那就是广度遍历.和其他三种遍历方法不同,二叉树的广度遍历需要额外的数据结构来帮助一下?什么数据结构呢?那就是队列.因为队列具有先进先出的特点,这个特点要求我们在遍历新的一层数据之前,必须对上一次的数据全部遍历结束.暂时还没有掌握队列知识的朋友可以看一看我的这一篇博客-队列. a)下面是新添加的队列数据结构

数据结构之二叉树的遍历汇总

声明:小弟写博客不久,主要是边上班边学习边写博客,如果错误,望各位包涵并指导. 二叉树是一种常用的非线性数据结构,二叉树是由一个根节点和称为根的左.右子树的两颗互不相交的二叉树构成.二叉树具有一些特殊的性质,如第i层上最多有2^(i-1)个结点.二叉树的链式存储结构如下: typedef struct BTNode { char data; //字符型数据; struct BTNode* lChild,*rChild; //左右子结点的指针; }BTNode,*BiTree; data为二叉树中

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉

数据结构——二叉树的遍历

"树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点,子节点有左右之分. 2)存储结构 二叉树的存储结构能够採用顺序存储,也能够採用链式存储,当中链式存储更加灵活. 在链式存储结构中,与线性链表类似,二叉树的每一个结点採用结构体表示,结构体包括三个域:数据域.左指针.右指针. 二叉树在C语言中的定义例如以下: struct BiTreeNode{ int c;

数据结构-王道2017-第4章 树与二叉树-二叉树的遍历

typedef int ElemType; typedef struct BitNode { ElemType data; //数据域 struct BitNode *lchild, *rchild; //左右孩子指针 }BitNode,*BitTree; void visit(BitNode *b) { printf("%d ", b->data); } //无论采用哪种遍历方法,时间复杂度都是O(n),因为每个结点都访问一次且仅访问一次,递归工作栈的栈深恰好为树的深度,空间复