二叉树的链式存储结构

只复习一下二叉树的遍历,其他的以后再看

表示

/* bt_data_t for bi tree */
typedef char bt_data_t;
#define NULL_DATA    ‘\0‘

/* data_t for queue which will hold the pointer of bitree_t */
typedef void *data_t;

typedef struct tree_node_t {
    bt_data_t         data;
    struct tree_node_t     *lchild, *rchild;
} bitree_t;

实现

bitree_t *CreateBitree(int i, bt_data_t data[], int n)
{
    bitree_t *root;
    int j;

    root = (bitree_t *)malloc(sizeof(bitree_t));
    root->data = data[i];

    j = 2 * i;
    if ((j <= n) && (data[j] != NULL_DATA)) {
        root->lchild = CreateBitree(j, data, n);
    } else {
        root->lchild = NULL;
    }

    j = 2 * i + 1;
    if ((j <= n) && (data[j] != NULL_DATA)) {
        root->rchild = CreateBitree(j, data, n);
    } else {
        root->rchild = NULL;
    }
    return root;
}

void PreOrder(bitree_t *root)
{
    if (NULL == root) return;
//do
    printf("%c ", root->data);
    PreOrder(root->lchild);
    PreOrder(root->rchild);
    return;
}

void InOrder(bitree_t *root)
{
    if (NULL == root) return;
    InOrder(root->lchild);
//do
    printf("%c ", root->data);
    InOrder(root->rchild);
    return;
}

void PostOrder(bitree_t *root)
{
    if (NULL == root) return;
    PostOrder(root->lchild);
    PostOrder(root->rchild);
//do
    printf("%c ",root->data);
    return;
}

void NoOrder(bitree_t *root)
{
    linkqueue_t *lq;

    /* create queue */
    lq = CreateEmptyLinkqueue();

    /* root node enters queue */
    EnQueue(lq, root);

    while (!EmptyLinkqueue(lq)) {

        DeQueue(lq, (data_t *)(&root));
        printf("%c ", root->data);

        if (root->lchild != NULL) {
            EnQueue(lq, root->lchild);
        }

        if (root->rchild != NULL) {
            EnQueue(lq, root->rchild);
        }
    }

    return;
}

测试代码

int main()
{
    bitree_t *root;

    bt_data_t bt_array[] = {0, /* reserved [0] */
        ‘A‘, ‘B‘, ‘C‘, ‘D‘,‘E‘, 0, ‘F‘, 0, 0, ‘G‘, ‘H‘, 0, 0, ‘I‘
        };

    root = CreateBitree(
        1,
        bt_array,
        sizeof(bt_array)/sizeof(bt_data_t) - 1);

    printf("PreOrder  : ");
    PreOrder(root);
    printf("\n");

    printf("InOrder   : ");
    InOrder(root);
    printf("\n");

    printf("PostOrder : ");
    PostOrder(root);
    printf("\n");

    printf("NoOrder   : ");
    NoOrder(root);
    printf("\n");

    return 0;
}

结果

PreOrder  : A B D E G H C F I
InOrder   : D B G E H A C I F
PostOrder : D G H E B I F C A
NoOrder   : A B C D E F G H I 
时间: 2024-12-23 02:28:39

二叉树的链式存储结构的相关文章

二叉树的链式存储结构--二叉链表

1 二叉树的链式存储结构 //二叉链表的结点结构定义 typedef struct BiTNode { int data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode; typedef struct BiTNode *BiTree; 结构示意图如下: 2 二叉树的遍历方法 (1)前序遍历:先访问根结,然后前序遍历左子树,再前序遍历右子树. (2)

二叉树的链式存储结构----二叉链表

头文件:head.h #include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<io.h> /* eof()

二叉树链式存储结构

二叉链表的C语言描述 基本运算的算法--建立二叉链表.先序遍历二叉树.中序遍历二叉树.后序遍历二叉树.后序遍历求二叉树深度 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

完全二叉树的链式存储结构的转化 &amp; 非递归中序遍历二叉树

1 /* 2 * 二叉树 3 * 4 * (将完全二叉树的数组形式改为链表形式) 5 * 6 * 1 7 * 2 3 8 * 4 5 6 7 9 * 8 10 * 11 */ 12 #include <iostream> 13 #define MAX 10 14 using namespace std; 15 16 typedef struct btnode{ 17 int data; 18 struct btnode * lchild; 19 struct btnode * rchild;

数据结构:二叉树的链式存储

数据结构:二叉树的链式存储(C语言版) 1.写在前面 二叉树同样有两种存储方式,数组和链式存储,对于数组来说,我们利用二叉树的性质然后利用下标可以方便的找到一个节点的子节点和父节点. 二叉树的性质: 1.二叉树的第i层上至多有2i-1个节点 2.深度为K的二叉树至多有2k-1个节点 3.任何一个二叉树中度数为2的节点的个数必度数为0的节点数目少1. 说明:度数为0,为叶子节点. 4.具有n个节点的完全二叉树的深度为|_Log2N_|+1 5.若完全二叉树中的某节点编号为i,则若有左孩子编号为2i

线性表的链式存储结构

1 n个结点链结成一个链表,即为线性表的链式存储结构,由于每一个结点只包含一个指针域,因此称为单链表. 链表中第一个结点的存储位置成为头指针,那么整个链表的存取就必须是从头指针开始了. 有时候会在单链表的第一个结点前附设一个结点,称为头结点. 头指针与头结点的区别: 头指针: (1)头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针. (2)头指针具有标识作用,所以常用头指针冠以链表的名字. (3)无论链表是否为空,头指针都不为空.头指针是链表的必要元素. 头结点: (1)

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

线性表—链式存储结构

链式存储结构就是一环扣一环的线性结构,好像链条中的每一个人都只知道下一个人的地址,只有从前往后顺序查找才能找到第 j 个人. 链式结构的好处是在插入和删除时不需要移动插入位置后面的元素,但要找到要插入和删除的元素的位置还是得像顺序存储结构一样查找,但这个查找还有所不同,顺序存储结构支持我们使用二分查找之类的方法进行查找插入以及删除的位置,至于链式结构感觉似乎没法使用二分法类似的方法(充分利用有序这一条件进行查找) 链式存储结构适合于插入删除操作比较多的场合,比如飞机航班的乘客信息,至于学校的学生

03.线性表(二)链式存储结构.单链表1

链式存储结构.单链表1 1.基本概念 为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置) (1)数据域:存储线性表数据元素数据信息的域称为数据域: (2)指针域:把存储直接后继位置(下一个数据元素的地址)的域称为指针域,指针域中存储的信息为指针或链: (3)结点(Node):由数据域和指针域两部分信息组成数据元素ai的存储映像,称为结点. (4)头指针:把链表中第一个结点的存储