赞
踩
前言
二叉树是一种非线性结构,它在计算机中的存储方式和线性结构一样,也有顺序存储映像和链式存储映像
一、二叉树的顺序存储表示
1、用一组地址连续的存储单元,依次自上向下,自左向右存储二叉树上的结点元素
2、该结构适合于完全二叉树,但是对于任意二叉树,势必会造成大量的内存浪费,如下所示的非完全二叉树的顺序存储结构,可见浪费了很多内存。最坏的情况是,深度为k的树,只有k个结点,但却需要长度为2^k-1的一维数组
3、其顺序存储表示如下
/************************************************************************/
/* 二叉树的顺序存储表示 */
/************************************************************************/
#define MAX_TREE_SIZE 100
typedef int TElemType;
typedef TElemType SqiBiTree[MAX_TREE_SIZE];
SqiBiTree bt;
二、链式存储结构
1、链式存储结构有三种结构:二叉链表、三叉链表、线索链表
2、二叉链表存储数据域和左右子树指针;三叉链表存储是在二叉链表的基础上加了一个指向双亲结点的指针;线索链表是在二叉链表的基础上利用二叉链表空余的空链域指向每个结点的直接前驱或者后继
3、本次讨论二叉链表的实现
/************************************************************************/ /* 二叉树的二叉链表存储表示 */ /************************************************************************/ typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,BiTree; /*构建不带数据的结点*/ BiTNode* NewBiTNode() { BiTNode *p=(BiTNode*)malloc(sizeof(BiTNode)); if (!p) { return NULL; } p->lchild=NULL; p->rchild=NULL; return p; } /*构建带数据的结点*/ BiTNode* NewBiTNode(TElemType e) { BiTNode *p=(BiTNode*)malloc(sizeof(BiTNode)); if (!p) { return NULL; } p->data=e; p->lchild=NULL; p->rchild=NULL; } /*由一个根节点数据和左右子树构建二叉树*/ void CreateBiTree(BiTree **bt,TElemType e,BiTree *lbt,BiTree *rbt) { BiTNode *p=NewBiTNode(e); p->lchild=lbt; p->rchild=rbt; *bt=p;//bt是二级指针,指向指针变量的地址;此处指向指针p的地址 } /*先序遍历二叉树*/ void PreOrderTraverse(BiTree *root) { if (root!=NULL) { printf("%d ",root->data);//先访问根结点 PreOrderTraverse(root->lchild);//先序遍历根的左子树 PreOrderTraverse(root->rchild);//先序遍历根的右子树 } } /*中序遍历二叉树*/ void InOrderTraverse(BiTree *root) { if (root!=NULL) { InOrderTraverse(root->lchild);//先序遍历根的左子树 printf("%d ",root->data);//中间访问根结点 InOrderTraverse(root->rchild);//先序遍历根的右子树 } } /*后序遍历二叉树*/ void PostOrderTraverse(BiTree* root) { if (root!=NULL) { PostOrderTraverse(root->lchild);//先序遍历根的左子树 PostOrderTraverse(root->rchild);//先序遍历根的右子树 printf("%d ",root->data);//最后访问根结点 } }
主程序运行代码:
int _tmain(int argc, _TCHAR* argv[]) { BiTree *bt=NULL,*bt1=NULL,*bt2=NULL,*bt3=NULL; CreateBiTree(&bt2,10,bt1,bt1);//创建一个只有根节点的树 CreateBiTree(&bt3,20,bt1,bt1);//创建一个只有根节点的树 CreateBiTree(&bt,30,bt2,bt3);//创建一个根节点加左右子树的树 CreateBiTree(&bt,40,bt,bt2); CreateBiTree(&bt,50,bt2,bt); PreOrderTraverse(bt); printf("\n"); InOrderTraverse(bt); printf("\n"); PostOrderTraverse(bt); printf("\n"); system("pause"); return 0; }
主程序建二叉树过程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。