【深入理解数据结构】二叉树实践
来源:互联网 发布:夺宝软件开发 编辑:程序博客网 时间:2024/05/29 12:47
数据结构的本质:
数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算。
什么是逻辑结构?
数据之间的逻辑关系,我们通常分成四种:
1)集合 , 结构中的数据元素除了同属于一种类型外,别无其它关系。
2)线性结构 , 结构中的数据元素之间存在一对一的关系。
3)树型结构 , 结构中的数据元素之间存在一对多的关系。
4)图状结构或网状结构 , 结构中的数据元素之间存在多对多的关系。
什么是物理结构?
数据在内存中的存储形式,我们通常分成两种:
1)顺序存储,在内存中严格连续存放,可以通过数组来实现;
2)链式存储,在内存中不连续存放,可以通过指针来实现。
逻辑结构和物理结构的相互关系有什么意义?
逻辑结构越复杂,顺序存储缺点越明显,链式存储优点越突出。
注:以下均以链式存储来分析。
单向链表
typedef struct node{ datetype val; //结点的内容 struct node *next; //指向下一个结点}
双向链表
typedef struct node{ datetype val; //结点的内容 struct node *head; //指向前一个结点 struct node *rear; //指向后一个结点}
二叉树
由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二叉树。
typedef struct btree{ datetype val; //结点内容 btree *left; //指向左子树 btree *right; //指向右子树}B;
/*文件名:Btree.c摘要:1)利用递归的思想创建二叉树,先访问根节点,再访问左结点,最后访问右结点(先序遍历的思想——DLR)。2)利用堆栈输出二叉树,遍历左树——入栈——出栈——遍历右树。完成日期:2012-7-3 15:23作者:黄路*/#include<stdio.h>#include<stdlib.h>typedef struct Bitree{int data;struct Bitree *Lchild; //左子树struct Bitree *Rchild; //右子树}BitreeNode;typedef BitreeNode *LinkBitree;typedef struct Stack{LinkBitree data[20];int top,bottom;}Stack;typedef Stack *StackList;//建树LinkBitree CreatBitree();//初始化栈StackList InitStack();//先序输出void InorderTraverse(LinkBitree Head, StackList Stack);int main(){LinkBitree BitreeHead;StackList Stack;printf("请输入根结点的值:e = ");BitreeHead = CreatBitree();Stack = InitStack();InorderTraverse(BitreeHead, Stack);return 0;}/*功能:利用‘递归的思想’创建 树输入:键盘输入根节点输出:树*/LinkBitree CreatBitree(){int edata;//根结点LinkBitree Head;scanf("%d", &edata); //如果根节点为0,则停止在此根结点上建子树if(edata==0){Head = NULL;}else{ Head = (LinkBitree)malloc(sizeof(BitreeNode)); //memory check if(Head == NULL){printf("内存分配失败!!"); exit(0);}else{Head->data = edata;printf("请输入结点%d的左孩子的值:e= ", Head->data);Head->Lchild = CreatBitree();printf("请输入结点%d的右孩子的值:e= ", Head->data);Head->Rchild = CreatBitree();}}return Head;}/*功能:初始化栈栈空间是用来存放 子树的。*/StackList InitStack(){StackList Stack;Stack = (StackList)malloc(sizeof(Stack));if(Stack == NULL){printf("内存分配失败!!");exit(0);}else{Stack->top = 0;Stack->bottom = 0;}return Stack;}//先访问根结点,再访问左树,再访问右树void InorderTraverse(LinkBitree Head, StackList Stack){do{while (Head != NULL) //穷尽所有的左子树为止{printf("%d ", Head->data); //打印左树的根结点Stack->data[Stack->top] = Head;//将访问过的子树入栈Stack->top++; //栈头Head = Head->Lchild; //访问下一个左子树}if (Stack->top != 0)//穷尽栈为止{Stack->top--;Head = Stack->data[Stack->top]; //出栈Head = Head->Rchild; //访问下一个右子树}}while(Stack->top != 0 || Head != NULL);}
- 【深入理解数据结构】二叉树实践
- 二叉树理解与实践
- 数据结构学习之二叉树(实践篇)
- 数据结构学习之二叉树(实践篇)
- 数据结构之二叉树实践练习
- 深入理解二叉搜索树(BST)
- 【BSTree】深入理解二叉搜索树
- 深入理解二叉搜索树(BST)
- [转载]数据结构二叉树深层理解
- 数据结构实践项目——树和二叉树
- 数据结构实践——用二叉树求解代数表达式
- 数据结构实践——用二叉树求解代数表达式
- 数据结构实践——二叉树算法库
- 数据结构实践—— 二叉树遍历的递归算法
- 数据结构实践——二叉树遍历思想解决问题
- 数据结构实践——用二叉树求解代数表达式
- Simon-【深入理解数据结构】有根树的不同实现② —— 二叉堆
- 数据结构基础 之 深入理解二叉堆建立的时空复杂
- javascript同源策略和跨域实验及其跨域解决办法
- 服务器的1U,2U是什么概念
- 实现TCP并发服务器之二(多线程)
- C++ How To Program整理(7)
- 解决Ubuntu wireshark找不到Interface问题
- 【深入理解数据结构】二叉树实践
- Android ArrayAdapter 详解
- 合格程序员每天每周每月每年应该做的事
- Django基础学习之Cookie 和 Sessions 应用
- JSon SuperObject 研究2:数据集与JSON对象互转
- /usr/bin/ld: cannot find -lsqlite3
- JSon SuperObject 研究
- Listview介绍与使用
- 关于__irq 的使用