二叉树——基本概念

二叉树的概念

  树是一种非线性的数据结构,他有n(n>=0)个有限的结点组成的一个有层次关系的集合。之所以叫树,是因为这种数据结构看起来像是一个倒挂的树,根朝上,叶子朝下。特点就是每个结点有0个或多个结点,没有父结点的结点称为根结点,并且每一个非根结点有且只有一个父结点。二叉树就是其中的一种,二叉树中的每个结点只有两个子结点。

二叉树在实际中的优势

  在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势,二叉树也是一种常用的数据结构。

树中的名词:

结点的度:一个节点含有子树的个数称为这个结点的度。
树的度:一棵树中,最大的结点的度。
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
树的高度或深度:树中结点的最大层次。
兄弟节点:具有相同父节点的节点互称为兄弟节点。
二叉树(图)
在这里插入图片描述
特殊的二叉树
  满二叉树:一个二叉树,如果每一层的系结点都达到了最大值,则这个二叉树就是满二叉树。如果一个二叉树的层数位K,且结点总数是(2^K)-1,这个二叉树就是满二叉树。
  完全二叉树:完全二叉树是效率很高的数据结构,如果一个二叉树的深度为n,除第n层外,其他各层(1~n-1)的节点数都达到最大个数,第h层所有节点都连续集中在最左边,这个二叉树就是完全二叉树。
二叉树的性质:
  若规定根节点的层数为1,则一个非空二叉树的第i层上最多有2^(i-1)个结点。(i>0)
  若规定只有根节点的深度为1,则深度为n的二叉树的最大结点数是(2^n)-1。(k>=0)
  对于任何一个二叉树,如果其叶子结点个数为n0,度为2的非叶子结点个数为n2,则有n0=n2+1。
  具有n个结点的完全二叉树深度k为log2(n+1)向上取整.
  对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有结点从0开始编号,则对于  序号为i的结点有:如果i>0,双亲序号为(i-1)/2;如果i=0,i为根节点编号,  没有父结点;如果2i+1<n,左孩子序列号为2i+1,否则没有左孩子;如果2i+2<n,右孩子序列号为2i+2,否则没有右孩子。
二叉树的存储
链式和顺序存储(堆)
二叉树链式存储实现


//创建新结点
BTreeNode* BuyBTreeNode(BTdataType data)
{BTreeNode* pNewNode = (BTreeNode*)malloc(sizeof(BTreeNode));if (pNewNode == NULL){assert(0);return NULL;}pNewNode->data = data;pNewNode->left = NULL;pNewNode->right = NULL;return pNewNode;
}//创建二叉树
BTreeNode* _CreatNode(vector<int> arr, size_t* index, BTdataType falg)
{BTreeNode* root = NULL;if (*index < arr.size() && arr[*index] != falg){root = BuyBTreeNode(arr[*index]);(*index)++;root->left = _CreatNode(arr, index, falg);(*index)++;root->right = _CreatNode(arr, index, falg);}return root;
}BTreeNode* CreatBTree(vector<int> arr, BTdataType falg)
{size_t index = 0;return _CreatNode(arr, &index, falg);
}//前序遍历(递归)
void PreOrde(BTreeNode * root)
{if (root != NULL){cout << root->data << " ";PreOrde(root->left);PreOrde(root->right);}
}
//前序遍历(非递归)
void PreOrde1(BTreeNode* root)
{//从最右结点开始压栈stack<BTreeNode*> buff;BTreeNode* cur = root;while (!buff.empty() || cur != NULL){//向当前结点的左边一直延伸,直到NULL为止while (cur){cout << cur->data << " ";buff.push(cur);cur = cur->left;}//到这里就说明当前结点为空了//如果栈中有数据,就说明不是二叉树的最后一个结点//就需要继续向后走if (!buff.empty()){BTreeNode* temp = buff.top();buff.pop();cur = temp->right;}}
}//中序遍历(递归)
void InOrde(BTreeNode * root)
{if (root != NULL){InOrde(root->left);cout << root->data << " ";InOrde(root->right);}
}
//中序遍历(非递归)
void InOrde1(BTreeNode* root)
{stack<BTreeNode*> buff;BTreeNode* cur = root;while (!buff.empty() || cur != NULL){while (cur){buff.push(cur);cur = cur->left;}if (!buff.empty()){BTreeNode* temp = buff.top();buff.pop();cout << temp->data << " ";cur = temp->right;}}
}//后序遍历
void PostOrde(BTreeNode * root)
{if (root != NULL){PostOrde(root->left);PostOrde(root->right);cout << root->data << " ";}
}
//后序遍历(非递归)
void PostOrde1(BTreeNode* root)
{stack<BTreeNode*> buff;BTreeNode* cur = root;//使用一个栈来同步当前结点的右子树是否已经处理完stack<bool> rf;while (!buff.empty() || cur != NULL){while (cur){buff.push(cur);cur = cur->left;//在判断栈中插入false,说明当前结点还有右子树没有遍历rf.push(false);}if (!buff.empty()){bool temp = rf.top();//如果是false,说明右子树还没有处理完//否则可以打印当前结点,右子树已经遍历完了if (temp){cout << buff.top() << " ";buff.pop();rf.pop();}else{rf.pop();rf.push(true);cur = buff.top();}}}
}//获取当前结点的左孩子
BTreeNode* LeftChild(BTreeNode* root)
{return root->left;
}
//获取当前结点的右孩子
BTreeNode* RightChild(BTreeNode* root)
{return root->right;
}//销毁树
void DestoryBTree(BTreeNode** root)
{assert(root);if (*root){DestoryBTree(&(*root)->left);DestoryBTree(&(*root)->right);free((*root));*root = NULL;}
}//树中结点的个数
int BTreeSize(BTreeNode* root)
{if (root == NULL)return 0;elsereturn BTreeSize(root->left) + BTreeSize(root->right) + 1;
}//树中叶子结点的个数
int BTreeLeafSize(BTreeNode* root)
{if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return BTreeLeafSize(root->left) + BTreeLeafSize(root->right);
}//树的高度
int BTreeHeight(BTreeNode* root)
{if (root == NULL)return 0;else{return max(BTreeHeight(root->left), BTreeHeight(root->right)) + 1;}
}//在树中查找
BTreeNode* BTreeFind(BTreeNode* root, BTdataType x)
{if (root = NULL)return NULL;else if (root->data == x)return root;BTreeNode* ret = BTreeFind(root->left, x);if (ret != NULL){return ret;}elsereturn BTreeFind(root->right, x);}//树的层序遍历
void BinaryTreeLeveOrder(BTreeNode* root)
{if (root == NULL)return;queue<BTreeNode*> s;s.push(root);while (!s.empty()){BTreeNode* tmp = s.front();s.pop();cout << tmp->data << " ";if (tmp->left != NULL)s.push(tmp->left);if (tmp->right != NULL)s.push(tmp->right);}
}//树的层数
int BTreeLevelKSize(BTreeNode* root, int k)
{if (root == NULL || k <= 0)return 0;if (k == 1)return 1;return BTreeLevelKSize(root, k - 1) + BTreeLevelKSize(root, k - 1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式第三集——装饰者模式(Decorator)

再次强调设计的重要原则&#xff1a;对扩展开放&#xff0c;对修改关闭。在设计中要尽量避免对之前源代码的修改。 为适应扩展的特性&#xff0c;除了继承之外&#xff0c;还可以用装饰者模式&#xff1a;动态的将新的功能附加到对象上。换句话说&#xff0c;装饰者模式就是有一…

AI开放只是幌子?科技巨头边承诺开放边申请专利

选自 I Wired编译 I 网易智能参与 I 木秀林据《连线》报道&#xff0c;上周在旧金山举行的谷歌云计算会议上&#xff0c;该公司CEO桑德尔皮查伊提到公司致力于人工智能&#xff08;AI&#xff09;的开放。他表示&#xff1a;“我们创立开放的平台&#xff0c;分享我们的技术&am…

两种列式存储格式:Parquet和ORC

背景 随着大数据时代的到来&#xff0c;越来越多的数据流向了Hadoop生态圈&#xff0c;同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要&#xff0c;在Hadoop生态圈的快速发展过程中&#xff0c;涌现了一批开源的数据分析引擎&#…

数据链路层(学习笔记)

首先要明确“数据链路”和“链路”这两个概念&#xff1a; 链路&#xff1a;从一个节点到相邻节点的一段物理现路&#xff0c;其中间没有任何的交换节点&#xff0c;所以可以说链路只是一条路径的组成部分。   数据链路&#xff1a;当需要在一条线路上传送数据的时候&#xf…

免otp动态密码登录堡垒机

环境准备 安装brew 参考文档&#xff1a;https://brew.sh/index_zh-cn.html 安装oath-toolkit 和expect brew install oath-toolkit brew install expect 正式开始 生成MFA_KEY对应的6位otp密码&#xff1a;oathtool -b --totp [MFA_KEY] MFA_KEY就是你绑定APP时&#x…

英特尔10纳米处理器再度跳票,或收缩芯片代工业务

来源&#xff1a;腾讯科技摘要&#xff1a;在全球半导体行业&#xff0c;线宽&#xff08;N纳米&#xff09;是制造厂商进行激烈竞争的指标。在全球半导体行业&#xff0c;线宽&#xff08;N纳米&#xff09;是制造厂商进行激烈竞争的指标。据报道&#xff0c;英特尔将延期到20…

简单GDB调试

GDB下载 使用yum工具直接下载 生成可用gdb调试的可执行程序 -g 会保留源文件中的函数名和变量名 启动gdb gdb 可执行程序名 set args xxx xxx 给程序传参查看程序中的源代码 当前文件 l(list) l 行号 l 函数名 非当前文件 l 文件名&#xff1a;行号 l 文件名&#xf…

人工智能应用需要高可信性(180806)

来源&#xff1a;科学网摘要&#xff1a;近日&#xff0c;“Rekognition”却闹了一个大乌龙&#xff1a;28名美国国会议员被它识别成了罪犯。小编搞了大半辈子测试和容错&#xff0c;对这方面消息比较敏感。最近看到新闻&#xff0c;商业巨头亚马逊2016年推出图像识别AI系统“R…

暑假集训中期测试 Problem D: 装箱问题2 (并查集)

Description 有很多个棱长为1的正方体货物整齐地堆在一堆。不过有一些是悬空的&#xff0c; 大概是粘上去的吧。。。 给出这些货物的相邻关系&#xff0c;求最小的长方体&#xff08;或正方体&#xff09;能装下这些货物的集装箱的体积&#xff0c;&#xff08;集装箱棱长方向与…

s3cmd安装及使用

一、安装 1.下载安装包。 这里我们使用s3cmd-1.0.0.tar.gz安装包 2.解压安装包 tar xzvf s3cmd-1.0.0.tar.gz 3.移动路径 mv s3cmd-1.0.0 /usr/local/s3cmd 4.创建软链接 ln -s /usr/local/s3cmd/s3cmd /usr/bin/s3cmd 5.执行配置命令(按提示输入相应密码等) s3cmd -…

二叉树——堆

二叉树顺序存储结构 理解堆之前先理解一下二叉树的顺序存储结构。普通的二叉树并不适合顺序存储&#xff0c;因为可能会造成大量的空间浪费。只有完全二叉树适合顺序结构存储。显示中我们通常把堆使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统中虚拟进程…

open AI 在DOTA 5v5 比赛中战胜职业选手

来源&#xff1a;AI科技大本营摘要&#xff1a;去年&#xff0c;OpenAI 在 DOTA 的 1v1 比赛中战胜了职业玩家 Dendi&#xff0c;而在距离进阶版 OpenAI Five 系统战胜人类业余玩家不过一个月的时间&#xff0c;今天凌晨&#xff0c;它又以 2:1 的战绩再次完成对人类高级玩家的…

如何体现机器智能和群体智能的关系,2018新版互联网大脑模型绘制

作者&#xff1a;刘锋 计算机博士 互联网进化论作者2018年新的这一版&#xff0c;也是互联网大脑模型图的第五个版本&#xff0c;距离第一版的发布已经有10年时间&#xff08;2008年&#xff09;&#xff0c;距离上一版第四版也有1年时间&#xff0c;在这一版中主要解决了如何…

全球互联正在创造一个知识极大丰富和隐私终结的时代

来源&#xff1a;资本实验室摘要&#xff1a;据预测&#xff0c;到2020年&#xff0c;全球物联网连接设备将超过500亿个&#xff0c;会产生600泽字节的信息。这么庞大的数据量&#xff0c;将如何影响并改变我们的生活和工作&#xff1f;聚焦前沿科技创新与传统产业升级据预测&a…

泡沫破裂之后,强化学习路在何方?

作者&#xff5c;侯宇清、陈玉荣来源&#xff5c;智能单元编辑&#xff5c;Debra一、深度强化学习的泡沫2015 年&#xff0c;DeepMind 的 Volodymyr Mnih 等研究员在《自然》杂志上发表论文 Human-level control through deep reinforcement learning[1]&#xff0c;该论文提出…

一篇文章搞懂数据仓库:维度表(设计原则、设计方法)

目录 1、什么是维度表&#xff1f; 2、维度表设计原则 &#xff08;1&#xff09;维度属性尽量丰富&#xff0c;为数据使用打下基础 &#xff08;2&#xff09;给出详实的、富有意义的文字描述 &#xff08;3&#xff09;区分数值型属性和事实 &#xff08;4&#xff09;…

Github项目:AI消除马赛克实战

目录 1、原理 2、准备工作 3、消除马赛克 4、效果对比 1、原理 该算法利用线性盒滤波器分别处理每个块的事实。对于每个块&#xff0c;它将搜索图像中的所有块像素化以检查直接匹配。 对于大多数像素化图像&#xff0c;Depix能够找到单个匹配结果。它假设这些是正确的。然…

C++继承一览

继承的概念及定义 继承机制是面向对象程序设计是代码可以复用的重要手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生的类称为派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体现了由简单到复杂的认知过程。…

人工智能能否复制人脑引争论 美媒:目前AI仍存在局限性

来源&#xff1a;网易智能摘要&#xff1a;人们应用人工智能技术&#xff08;AI&#xff09;的所有领域&#xff0c;包括无人驾驶汽车、机器人医生、超过10亿中国公民的社会信用评分系统等&#xff0c;当前都取决于一场关于如何让AI做其不能做的事的辩论。8月6日报道称&#xf…

Tushare免费获取股票数据:实时数据,历史数据,行情数据

一 操作手册 引导用户顺利开始使用Tushare Pro数据&#xff0c;以下步骤将带您开始Tushare数据之旅&#xff1a; 用户注册登录后可调用数据&#xff1a;https://tushare.pro/register?reg399205 二 如何获取TOKEN凭证 1、登录成功后&#xff0c;点击右上角->个人主页 2、…