二叉树数组C++实现
基本概念梳理
- 孩子:子结点
- 双亲:父节点
- 度:有多少个子结点
- 有序树:固定的排列的树
- 无序树:排列与顺序无关的树
- 二叉树:所有结点小于等于2的树
需要实现的方法
#pragma once
#ifndef TREE_H
#define TREE_H class Tree
{
public:
Tree(int size,int *pRoot);//创建树
~Tree();//销毁树
int *SearchNode(int nodeIndex);//根据索引寻找结点
bool AddNode(int nodeIndex, int direction, int *pNode);//添加结点
bool DeleteNode(int nodeIndex, int *pNode);//删除结点
void TreeTraverse();//遍历
private:
int *m_pTree;
int m_iSize;
}; #endif // !TREE_H
1.创建树
传入数组容量和根节点地址
m_iSize和m_pTree初始化
将数组都置为0初始化
pRoot指向的内存单元的树值赋值数组首元素(根元素)
Tree::Tree(int size, int *pRoot)
{
m_iSize = size;
m_pTree = new int[m_iSize];
for (int i = ; i < m_iSize; i++)
{
m_pTree[i] = ;
}
m_pTree[] = *pRoot;
}
2.销毁树
删除指针并置空
Tree::~Tree()
{
delete []m_pTree;
m_pTree = NULL;
}
3.根据索引寻找结点
先判断索引的合法性,索引不能小于0或者大于等于长度
传入数组的值不能等于0
返回该数组地址
int *Tree::SearchNode(int nodeIndex)
{
if (nodeIndex< || nodeIndex>=m_iSize)
{
return NULL;
}
if (m_pTree[nodeIndex] == )
{
return NULL;
}
return &m_pTree[nodeIndex];
}
4.添加结点
判断索引合法性,和3.一样
direction = 0代表添加左子节点,direction = 1代表添加右子节点
左子节点 = 2*索引+1;右子节点 = 2*索引+2
下图可以验证
继续判断索引的合法性,左子节点和右子节点同样不能小于0或者大于等于数组长度
最后将*pNode赋值给子节点
bool Tree::AddNode(int nodeIndex, int direction, int *pNode)
{
if (nodeIndex< || nodeIndex >= m_iSize)
{
return false;
}
if (m_pTree[nodeIndex] == )
{
return false;
}
if (direction == )
{
//nodeIndex * 2 + 1<0可以省略
if (nodeIndex * + < || nodeIndex * + >= m_iSize)
{
return false;
}
//判断是否有左子节点
if (m_pTree[nodeIndex * + ] != )
{
return false;
}
m_pTree[nodeIndex * + ] = *pNode;
}
if (direction == )
{
//nodeIndex * 2 + 2<0可以省略
if (nodeIndex * + < || nodeIndex * + >= m_iSize)
{
return false;
}
//判断是否有左子节点
if (m_pTree[nodeIndex * + ] != )
{
return false;
}
m_pTree[nodeIndex * + ] = *pNode;
}
return true;
}
5.删除结点
判断索引和数组值的合法性
将*pNode接收删除的对应索引的数组
将该索引数组置为0,结点值等于0代表删除
返回正确结果
bool Tree::DeleteNode(int nodeIndex, int *pNode)
{
if (nodeIndex< || nodeIndex >= m_iSize)
{
return false;
}
if (m_pTree[nodeIndex] == )
{
return false;
}
*pNode = m_pTree[nodeIndex];
m_pTree[nodeIndex] = ;
return true;
}
6.遍历
没啥好说的
void Tree::TreeTraverse()
{
for (int i = ; i < m_iSize; i++)
{
cout << m_pTree[i] << " ";
}
}
二叉树数组C++实现的更多相关文章
- UVA548-Tree(二叉树数组表示)
Problem UVA548-Tree Accept: 2287 Submit: 13947 Time Limit: 3000 mSec Problem Description You are to ...
- 模拟画图题P1185 绘制二叉树
题目链接P1185 绘制二叉树 题意概述 根据规则绘制一棵被删去部分节点的满二叉树.节点用 \(o\) 表示,树枝用/\表示.每一层树枝长度会变化,以满足叶子结点有如下特定: 相邻叶子节点是兄 ...
- 剑指Offer 树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分为2个部分.1先找出A中和B根节点相同的节点r. 2,咱判断B中所有孩子节点是不 ...
- Hark的数据结构与算法练习之锦标赛排序
算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...
- YTU 3022: 完全二叉树(1)
原文链接:https://www.dreamwings.cn/ytu3022/2595.html 3022: 完全二叉树(1) 时间限制: 1 Sec 内存限制: 128 MB 提交: 26 解决 ...
- LeetCode算法题-Merge Two Binary Trees(Java实现)
这是悦乐书的第274次更新,第290篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第142题(顺位题号是617).提供两个二叉树,将其合并为新的二叉树,也可以在其中一个二 ...
- Noj - 在线强化训练4
状态 题号 竞赛题号 标题 × 1092 A 童年的回忆——计算24 × 1145 B 求图像的周长 × 1144 C 农场灌溉问题 × 1202 D 数独游戏 × 1243 E 循环赛日程表 × 1 ...
- 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题
今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...
- Java之List和Set
List.Set.数据结构.Collections 初次学习,涉及到List集合,Set集合和数据结构方面的一些知识,有错误还请批评指正 数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. ...
随机推荐
- C/C++文件输入输出流
C++方式 C方式 头文件 fstream stdio.h open file.open(const char *filename,const char *mode) FILE* fo ...
- ASP.NET程序从IIS6移植到IIS7时出现500.22错误(转)
最可能的原因: • 此应用程序在 system.web/httpModules 节中定义配置. 可尝试的操作: • 将配置迁移到 system.webServer/modules 节.也可 ...
- 云课堂Android模块化实战--如何设计一个通用性的模块
本文来自 网易云社区 . 如何设计一个通用性的模块 前言 每个开发者都会知道,随着项目的开发,会发现业务在不断壮大,产品线越来越丰富,而留给开发的时间却一直有限,在有限的时间,尽快完成某个功能的迭代. ...
- “全栈2019”Java第四十六章:继承与字段
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- CentOS 下设置 SELinux 安全上下文
作用: chcon 命令用来改变 SELinux 文件属性即修改文件的安全上下文 用法: chcon [ 选项 ] CONTEXT 文件 选项: -R:递归改变文件和目录的上下文. --referen ...
- Docker 下系统日志恢复
众所周知,docker 是一款进程级虚拟机.上文我们已经分析解释了该如何使用,本文针对日志消失问题进行恢复与解释. Docker 可以理解为阉割版的系统,内部功能不全.可以通过组件安装进行基本功能恢复 ...
- iOS 发送位置消息
发送地理位置在社交应用里面是很常用的需求.最近也需要在自己的应用里面加入这个功能 首先我们需要获取自己的地理位置,这里用到 CLLocationManager 这个类,调用如下代码 locationM ...
- 2016级算法第四次上机-F.AlvinZH的最“长”公共子序列
940 AlvinZH的最"长"公共子序列 思路 DP,难题. \(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数. 初始化:dp[i][0] ...
- MySql 的操作日志 历史记录
如何查看mysql数据库操作记录日志 1.首先确认你日志是否启用了mysql>show variables like 'log_bin'. 2.如果启用了,即ON,那日志文件就在mysql的安装 ...
- pip安装python库总是超时或出错的解决办法
建个文件 ~/.pip/pip.conf, 内容如下 [global] timeout = index-url = http://pypi.douban.com/simple/ [install] u ...