数据结构----二叉树(1)遍历,建立,应用
来源:互联网 发布:淘宝客服岗位职责 编辑:程序博客网 时间:2024/06/06 07:42
学了几章的数据结构,我发现每一章对结构的阐述都会有以下三个步骤:
1.先定义数据结构和基本操作。就是所谓的抽象,把像的总体特征抽出来,有的也会去归纳出结构的性质。
2.数据结构的存储,一般分为顺序存储结构和链式存储结构。
3.根据存储结构来建立数据结构和给出实现各种操作的算法。
同样对二叉树的总结,我也用这种方法来组织吧。
1.二叉树的定义
(1)每个结点的度都不大于2;
(2)每个结点的孩子结点次序不能任意颠倒;
2.二叉树的存储结构
(1)顺序存储结构
将二叉树中编号为i的结点存放在数组的第i个分量中,可得结点i的左孩子位置为2*i;右孩子的位置为2*i+1。
优点:对于完全二叉树来说非常方便。
缺点:对于一般二叉树,必须用“虚结点”将其补成一颗“完全二叉树”来存储,由于编号为i的结点存放在i分量中,这就导致“虚结点”空间的浪费。
(2)链式存储结构
因为对于二叉树来说,每个结点都有左右孩子结点和双亲结点。可以设计每个结点包括三个域:数据域,左孩子域,右孩子域。分别存放结点数据,指向左孩子结点的指针,指向右孩子结点的指针。这样在建立二叉树时用递归方法,先建立根结点,再建立全部的左子树,后建立全部右子树。这时候在运行输入时也要按照建立的形式去输入,看是先序遍历建立还是其他的。(下面建立二叉树时讲)。
typedef struct Node{DataType data;struct Node *LChild;struct Node *RChild;}BiTNode, *BiTree;
3.二叉树的基本操作
先讲二叉树的遍历,再由遍历来引出二叉树的建立,因为二叉树也是利用递归遍历的形式来建立的。
(1)按照先左后右的的顺序分为三种:
先序遍历
void PreOrder(BiTree root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/{if (root!=NULL){Visit(root ->data); /*访问根结点*/PreOrder(root ->LChild); /*先序遍历左子树*/PreOrder(root ->RChild); /*先序遍历右子树*/}}
中序遍历
void InOrder(BiTree root) /*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/{if (root!=NULL){InOrder(root ->LChild); /*中序遍历左子树*/Visit(root ->data); /*访问根结点*/InOrder(root ->RChild); /*中序遍历右子树*/}}
后续遍历
void PostOrder(BiTree root) /* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/{if(root!=NULL){PostOrder(root ->LChild); /*后序遍历左子树*/PostOrder(root ->RChild); /*后序遍历右子树*/Visit(root ->data); /*访问根结点*/}}
(2)建立二叉树
#include <stdio.h>#include <malloc.h>#include <conio.h>typedef char DataType;typedef struct Node{DataType data;struct Node *LChild;struct Node *RChild;}BiTNode, *BiTree;void CreateBiTree(BiTree *bt){char ch;ch = getchar(); if(ch=='.') *bt=NULL; else {*bt=(BiTree)malloc(sizeof(BiTNode)); //生成一个新结点 (*bt)->data=ch; CreateBiTree(&((*bt)->LChild)); //生成左子树 CreateBiTree(&((*bt)->RChild)); //生成右子树}}
按照上述代码建立二叉树,如建立下图这样的二叉树,用户输入的格式应该是ABD.G...CE..F..【enter】。
(3)二叉树遍历的应用
需求:遍历二叉树并把每个结点的值和层数打印出来。
代码如下:
#include "bitTree.h"void visit(DataType data,int layer){printf("%c.....第%d层\n",data,layer);}void printLayer(BiTree T,int layer){if(T!=NULL){ visit(T->data,layer);printLayer(T->LChild,layer+1);printLayer(T->RChild,layer+1);}}void main(){BiTree T;int layer=1;printf("请输入二叉树:\n");hCreateBiTree(&T);printLayer(T,layer);}运行结果为:
0 0
- 数据结构----二叉树(1)遍历,建立,应用
- 数据结构-->二叉树遍历应用
- python数据结构--二叉树建立与遍历
- 数据结构 二叉树的建立与遍历
- 数据结构之二叉树(遍历、建立、深度)
- 数据结构之二叉树(遍历、建立、深度)
- 数据结构之二叉树(遍历、建立、深度)
- 数据结构之二叉树(遍历、建立、深度)
- 数据结构之二叉树(遍历、建立、深度)
- 数据结构之二叉树(遍历、建立、深度)
- 数据结构----二叉树----建立与遍历
- 二叉树建立和遍历,(数据结构清华大学版130页遍历实现)
- 数据结构——二叉树的建立和遍历(递归建树&层序遍历建树)
- 数据结构 树 二叉树的建立及遍历 C语言版
- 数据结构:二叉树的建立和遍历(C#实现)
- 数据结构 二叉树的建立 与各种遍历
- 数据结构实验(严蔚敏版)二叉树的建立与遍历
- 数据结构二叉树的建立以及递归遍历
- 给痛苦一个流淌的出口 (愿与君共勉)
- python with 和 contextlib
- Android游戏开发入门讲解-SurfaceView-2
- linux的nano命令
- 线性回归中的前提假设
- 数据结构----二叉树(1)遍历,建立,应用
- 想要下载 NS2仿真实验—多媒体和无线网络通信 CD光盘的童鞋,请移步百度网盘下载
- 主流web服务器介绍
- 最新最全的Android开发环境搭建教程
- python登录新浪微博并抓取内容
- VC6.0/mfc的radio button的获取方法(部分)针对初学者
- TI C66x DSP 系统events及其应用 - 5.1(QM accumulator的配置)
- VS2010下开发ActiveX 控件
- uva 10014 - Simple calculations