当前位置: 首页 > news >正文

树、二叉树

一、基本概念

1、只有一个前驱,但是可以有多个后继

2、节点

        1.根节点:最顶层节点(没有前驱)
        2.分支节点:有前驱也有后继
        3.叶子节点:没有后继的节点

3、层、深度、高度
    层:根节点所在为第一层,每过一个分支节点,层数+1 
    深度: 从根节点出发到达节点的分支节点个数称为该节点的深度
    高度:从叶子节点出发到该节点最大的节点个数称为该节点的高度

    树的高度:整个树形结构中高度最高的节点的高度称为树的高度
    树的深度:整个树形结构中深度最深的节点的深度称为树的深度
    树的层数 == 树的高度 == 树的深度

    节点的度: 叶子节点度数为0 
              节点的后继的个数


二叉树

所有节点中最大度数为2的树形结构

一、基本概念

1、满二叉树:满二叉树是一种特殊的二叉树,其中每个层级的节点数都是最大值,即每个层级都是完全填充的
2、完全二叉树:所有节点展开后,节点编号排列连续

3、二叉树特点:叶子节点、只有左孩子、只有右孩子、左右孩子都有
4、满二叉树:二叉树第k层最多有2^(k-1)个节点 
5、满二叉树有k层,则所有节点数为 2^k -1

二、基本操作

1、创建满二叉树

TreeNode *CreateCompleteTree(int StartNo, int EndNo)
{TreeNode *pTmpNode = NULL;pTmpNode = malloc(sizeof(TreeNode));if (NULL == pTmpNode){return NULL;}pTmpNode->pLeftChild = pTmpNode->pRightChild = NULL;pTmpNode->No = StartNo;if (2 * StartNo <= EndNo){pTmpNode->pLeftChild = CreateCompleteTree(2*StartNo, EndNo);}if (2 * StartNo + 1 <= EndNo){pTmpNode->pRightChild = CreateCompleteTree(2*StartNo+1, EndNo);}return pTmpNode;
}

2、前序遍历:根左右

int PreOrderBinTree(TreeNode *pRoot)
{printf("%c ", pRoot->Data);if (pRoot->pLeftChild != NULL){PreOrderBinTree(pRoot->pLeftChild);}if (pRoot->pRightChild != NULL){PreOrderBinTree(pRoot->pRightChild);}return 0;
}

3、中序遍历:左根右

int InOrderBinTree(TreeNode *pRoot)
{if (pRoot->pLeftChild != NULL){InOrderBinTree(pRoot->pLeftChild);}printf("%c ", pRoot->Data);if (pRoot->pRightChild != NULL){InOrderBinTree(pRoot->pRightChild);}return 0;
}

4、后续遍历:左右根

int PostOrderBinTree(TreeNode *pRoot)
{if (pRoot->pLeftChild != NULL){PostOrderBinTree(pRoot->pLeftChild);}if (pRoot->pRightChild != NULL){PostOrderBinTree(pRoot->pRightChild);}printf("%c ", pRoot->Data);return 0;
}

5、层序遍历

int LayerOrderBinTree(TreeNode *pRoot)
{struct list_head head;Data_t *pTmpNode = NULL;Data_t *pFreeNode = NULL;//树形结构为NULL直接返回if (NULL == pRoot){return -1;}  //初始化队列INIT_LIST_HEAD(&head);//申请一个节点(将树形结构地址放入链表中)pTmpNode = malloc(sizeof(Data_t));if (NULL == pTmpNode){return -1;}pTmpNode->pData = pRoot;//入队list_add_tail(&pTmpNode->node, &head);//只要队列不为NULL,出队一个元素,打印该元素,左右孩子不为NULL,入队while (!list_empty(&head)){//获得队头元素pFreeNode = list_entry(head.next, Data_t, node);printf("%c ", pFreeNode->pData->Data);//队头元素的左孩子入队if (NULL != pFreeNode->pData->pLeftChild){          pTmpNode = malloc(sizeof(Data_t));if (NULL == pTmpNode){return -1;}pTmpNode->pData = pFreeNode->pData->pLeftChild;list_add_tail(&pTmpNode->node, &head);}//队头元素的右孩子入队if (NULL != pFreeNode->pData->pRightChild){          pTmpNode = malloc(sizeof(Data_t));if (NULL == pTmpNode){return -1;}pTmpNode->pData = pFreeNode->pData->pRightChild;list_add_tail(&pTmpNode->node, &head);}//队头元素出队list_del(&pFreeNode->node);//释放该节点free(pFreeNode);}return 0;
}

6、创建完全二叉树 

TreeNode *CreateBinTree(void)
{char TmpData = 0;TreeNode *pTmpNode = NULL;scanf(" %c", &TmpData);if ('#' == TmpData){return NULL;}else{pTmpNode = malloc(sizeof(TreeNode));if (NULL == pTmpNode){return NULL;}pTmpNode->Data = TmpData;pTmpNode->pLeftChild = CreateBinTree();pTmpNode->pRightChild = CreateBinTree();}return pTmpNode;
}

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 42-java 为什么要有包装类
  • 设置 Nginx、MySQL 日志轮询
  • 栈与队列--python
  • webpack4手动搭建Vue项目
  • 石油设备和相关机械都包涵那些?
  • GLM-4-Long加持的RAG:更准,更简,更全!
  • 集运系统如何多维度展现企业业务情况?
  • Socket编程---UDP篇
  • 能大致讲一下Chat GPT的原理吗?
  • typedef区分结构体类型和结构体变量
  • 深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)
  • 数据结构(Java实现):栈和队列相关练习题
  • 人工智能的可解释性(XAI) | 使用LIME
  • 【qml实现TCP服务器】
  • 滑膜观测器
  • [nginx文档翻译系列] 控制nginx
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • extract-text-webpack-plugin用法
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Spring Cloud中负载均衡器概览
  • 闭包,sync使用细节
  • 测试开发系类之接口自动化测试
  • 技术:超级实用的电脑小技巧
  • 两列自适应布局方案整理
  • 我从编程教室毕业
  • 小而合理的前端理论:rscss和rsjs
  • 小试R空间处理新库sf
  • 《天龙八部3D》Unity技术方案揭秘
  • 阿里云重庆大学大数据训练营落地分享
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​520就是要宠粉,你的心头书我买单
  • ​学习一下,什么是预包装食品?​
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (初研) Sentence-embedding fine-tune notebook
  • (第一天)包装对象、作用域、创建对象
  • (六)vue-router+UI组件库
  • (五)关系数据库标准语言SQL
  • (一)UDP基本编程步骤
  • (转)setTimeout 和 setInterval 的区别
  • (转载)OpenStack Hacker养成指南
  • ***测试-HTTP方法
  • .net mvc部分视图
  • .net Signalr 使用笔记
  • .NET Standard 的管理策略
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • :class的用法及应用
  • @Controller和@RestController的区别?
  • @SuppressWarnings注解
  • @软考考生,这份软考高分攻略你须知道
  • [ linux ] linux 命令英文全称及解释
  • [ Linux ] Linux信号概述 信号的产生