西西软件下载最安全的下载网站、值得信赖的软件下载站!

首页编程开发其它知识 → 数据结构中二叉树基本操作学习

数据结构中二叉树基本操作学习

相关软件相关文章发表评论 来源:西西整理时间:2013/1/30 8:42:10字体大小:A-A+

作者:西西点击:0次评论:0次标签: 二叉树

谷歌浏览器2016(Chrome)v50.0.2661.75 官方正式版
  • 类型:浏览器类大小:43.2M语言:中文 评分:6.0
  • 标签:
立即下载

近日受人所托,搞了点二叉树的程序,顺便回顾了下二叉树的一些基本知识,特此总结。

二叉树的基本操作,可能包括:

创建,遍历,转化,复制,删除等

遍历:前中后三种顺序的遍历,已经是各数据结构与算法教程的最基础内容,在此不重复。

创建:大多数据结构教程当中的二叉树创建程序,都是采用的递归方式,递归方式创建的二叉树与遍历的过程相似,所创建的二叉树,也是采用左右子节点方式,后续进行遍历操作十分方便。

转化:直觉上,最简单的二叉树存储方式其实是如下图的数组:

*此图出自某高校数据结构ppt,但实在难以查证是哪个学校,无法直接感谢,请谅解。

首先,提供个满二叉树大小的数组,然后其中数值按完全二叉树存储。显然,此种顺序存储方法:第i号(这里编号指对应的完全二叉树的位序)结点的左右孩子一定保存在第2i及2i+1号单元中。故此,为兼顾存储的直观与遍历等操作的方便,从顺序数组向左右子节点存储方式的转化也就十分重要。

1-转化方法

分为几个步骤:

(1)准备原始数组

(2)分析数组中的有效值,对应二叉树节点非空;

(3)创建二叉树节点;

(4)计算除最后一层子节点外,构造节点间父子关系时的循环次数;

(5)构造二叉树节点间的父子关系;

(6)确实二叉树根节点;

主要代码:

(1)准备原始数组

//原始数组
    int intBiTreeInit[ARR_COUNT];

   
    //初始化原始数组至无效值
    for(int i=0;i<=ARR_COUNT-1;i++)
 intBiTreeInit[i]=NVALUE;

    //本if条件确保ARR_COUNT是否是的乘方-1
    if(0==(ARR_COUNT & (ARR_COUNT+1)))
    {
 for(int i=0;i<=ARR_COUNT-1;i++)
     intBiTreeInit[i]=2*(i+1);
    }
    else
 return RET_ERR;

    //使最后两数为无效值
    intBiTreeInit[ARR_COUNT-1]=NVALUE;
    intBiTreeInit[ARR_COUNT-2]=NVALUE;

(2)分析数组中的有效值

    //开始获得数组中有效值位置
    int intRel=0;
    int intArr=0;
    for(intArr=0;intArr<=intCount-1;intArr++)
    {
 if(elemArr[intArr]!=elemNValue)
 {
     intRel++;
     vecIntEffPos.push_back(intArr);
 }
 }

(3)创建二叉树节点

    //数组中有效值对应创建节点
    //同时初始化父子节点为NULL
    for(intArr=0;intArr<=intRel-1;intArr++)
    {
 pBiTreeTemp=(PBiTreeNode)malloc(sizeof(BiTreeNode));;
 
 if(NULL==pBiTreeTemp)    //判断是否有足够的内存空间
 {
     cout<<"Memory alloc failure"<<endl;
     return RET_ERR;
 }

 //将有效值赋予节点
 pBiTreeTemp->BiTreeData=elemArr[vecIntEffPos[intArr]];
 
 //初始化左右子节点为null,便于后续的遍历
 pBiTreeTemp->leftChild=NULL;
 pBiTreeTemp->rightChild=NULL;

 //先存节点值
 vecPBiTree.push_back(pBiTreeTemp);
   }

(4)计算除最后一层子节点外,构造节点间父子关系时的循环次数

//生成父子关系时最后一层不必遍历,故理论循环上限可优化

    int intSubLast=0;
    intSubLast=intCount-(intCount+1)/2;

(5)构造二叉树节点间的父子关系

    for(intArr=0;intArr<=intSubLast-1;intArr++)
    {
 //左右节点若存储有效值则同时创建父子关系
 if(elemArr[intArr*2+1]!=elemNValue)
     vecPBiTree[intArr]->leftChild=vecPBiTree[intArr*2+1];
     
 if(elemArr[intArr*2+2]!=elemNValue)
     vecPBiTree[intArr]->rightChild=vecPBiTree[intArr*2+2];
  }

(6)确实二叉树根节点

pBiTree=vecPBiTree[0];

转化为左右子节点方式存储后,则各种遍历操作按大多数教程的常规方式处理即可,如前序遍历函数:

int BiTreePreTrace(PBiTreeNode &pBiTree)
{
    //条件为非空树
    if(pBiTree)
    {
 cout<<"Node value="<<(pBiTree->BiTreeData)<<endl;
 
 BiTreePreTrace(pBiTree->leftChild);    //遍历左子树
 BiTreePreTrace(pBiTree->rightChild);    //遍历右子树
    }
    return RET_OK;
}

完整程序,请见附件文件

*上述程序在Windows7x64,vs2008环境编译运行通过。

    火狐浏览器
    (34)火狐浏览器
    火狐浏览器安卓版功能特性快速快速浏览从启动到页面加载,到平移和缩放,都有超快的浏览体验智能工具栏轻点智能工具栏,即可获得经常访问的网站列表,书签和历史记录,点击访问,无需输入便捷简洁易用标签页便于您同时浏览多个站点加载项提供无图阅读模式,流量受限时启用也能便捷查看网页智能同步从任何装置存取您浏览器的历史纪录,书签,密码,以及开启的标签页阅读自动将零散的文章组合成美观易读的页面插件提供多种功能插件以丰富您的浏...更多>>
    ie浏览器
    (39)ie浏览器
    西西软件园提供好用的浏览器官方下载,包括,浏览器真的是越来越强大了,界面极其清爽简洁新增网页固定功能智能网址地址栏快速访问入口独立标签页下载管理器开发人员工具多功能地址栏加载管理和跟踪保护功能支持和加速功能。...更多>>
    opera浏览器
    (34)opera浏览器
    目前市场上的安卓浏览器种类繁多,不过有一款浏览器却一直活跃在安卓系统上,那就是欧朋浏览器。欧朋浏览器是全球最流行的手机浏览器的中文版本。欧朋手机浏览器基于开发,延续小巧快速节省流量的优点,同时集成了诸多贴近中国用户的社会化应用。欧朋浏览器最大的特色就是快,与同类产品相比优势比较明显。体积小,适应性好,同时支持智能非智能手机。欧朋浏览器特点欧朋浏览器支持智能预读智能缩放手势操作,外加时尚个性化的界面...更多>>
    浏览器2016
    (24)浏览器2016
    西西软件园强力推荐的浏览器下载排行榜产品,目前市场上的浏览器产品众多,大家可能会有选择性困难,到底哪款浏览器速度最快,体验最好最安全这些都是在使用浏览器当中常见的疑问,如何选择一款最好的浏览器,其实最适合的就是最好的。火狐浏览器是一个完全开放源代码,任何人都可以自由参与开发的,支持多种操作系统的浏览器,因为其强大的可定制性和丰富的扩展程序而成为最有个性的浏览器.和支持最好,弹窗拦截和更胜一筹,执行速度...更多>>
    搜狗浏览器
    (68)搜狗浏览器
    搜狗浏览器是搜狗公司推出的国内首款集高速的内核谷歌浏览器内核与兼容的内核微软浏览器内核于一身的双核高速浏览器。最新推出的搜狗高速浏览器.正式版具有具有超高速,超兼容,超安全的特点。搜狗浏览器还具有扩展功能,涵盖了从工作学习生活服务系统工具时尚休闲资讯阅读到影音视频游戏娱乐大类余款扩展。更有包括登录助手如意淘微信摇一摇传图等特色扩展。搜狗助手搜狗助手是一款用于订购火车票的助手软件,能够减少大家在网上订...更多>>

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)
    推荐文章

    没有数据