数组形式二叉树之C++封装
来源:互联网 发布:什么软件测八卦 编辑:程序博客网 时间:2024/06/05 13:35
一、数组与二叉树的对应关系如下:
说明:节点在数组中的位置对应它在树中的位置,下标为0 的节点为根节点,下标为1是根的左节点,2为根节点的右节点,依次类推,从左到右的顺序存储树的每一层。
假设某一节点的索引是 n ,则:
其左子节点的索引 = n * 2 + 1;
其右子节点的索引 = n * 2 + 2;
其父节点的索引 = (n - 1)/ 2;
数组形式二叉树的主要操作有:
1、树的创建和销毁
2、树中节点的搜索
3、树中节点的添加和删除
4、树中节点的遍历
二、封装
.h文件:
#pragma onceclass CZzcArrayTree{public:CZzcArrayTree(int nSize,int* pTreeRoot);//创建树:树节点的多少;根节点~CZzcArrayTree();//销毁树int* SearchNode(int NodeIndex);//搜索节点bool AddNode(int NodeIndex,int Direction,int* pNode);//增加节点的父节点;增加为左节点或右节点;要增加的节点bool DeleteNode(int NodeIndex,int* pNode);//删除节点索引;输出删除的节点void TraverseTree();//遍历树void TraverseDel(int NodeIndex);//遍历删除一个节点的所有子节点private:int* m_pTree;int m_nSize;};
.Cpp文件:
#include "StdAfx.h"#include "ZzcArrayTree.h"#include <iostream>using namespace std;CZzcArrayTree::CZzcArrayTree(int nSize,int* pTreeRoot){m_nSize = nSize;m_pTree = new int[m_nSize];m_pTree[0] = *pTreeRoot;for (int i = 1;i < m_nSize;i++){m_pTree[i] = 0;}}CZzcArrayTree::~CZzcArrayTree(){if (m_pTree){delete[] m_pTree;m_pTree = NULL;}}int* CZzcArrayTree::SearchNode(int NodeIndex){if(NodeIndex < 0||NodeIndex >= m_nSize) return NULL;//索引值超范围if(m_pTree[NodeIndex] == 0) return NULL; //空节点return &m_pTree[NodeIndex];}bool CZzcArrayTree::AddNode(int NodeIndex,int Direction,int* pNode){if(NodeIndex < 0||NodeIndex >= m_nSize) return false;//索引值超范围if(m_pTree[NodeIndex] == 0) return false; //空节点不能添加子节点if (Direction == 0)//添加为左节点{int LeftChildIndex = NodeIndex * 2 + 1;if(LeftChildIndex >= m_nSize) return false;//超出范围if(m_pTree[LeftChildIndex] != 0) return false;//左节点已经有值m_pTree[LeftChildIndex] = *pNode;} else//添加为右节点{int RightChildIndex = NodeIndex * 2 + 2;if(RightChildIndex >= m_nSize) return false;//超出范围if(m_pTree[RightChildIndex] != 0) return false;//右节点已经有值m_pTree[RightChildIndex] = *pNode;}return true;}bool CZzcArrayTree::DeleteNode(int NodeIndex,int* pNode){if(NodeIndex < 0||NodeIndex >= m_nSize) return false;//索引值超范围if(m_pTree[NodeIndex] == 0) return false; //空节点不能删除*pNode = m_pTree[NodeIndex];m_pTree[NodeIndex] = 0;TraverseDel(NodeIndex);return true;}void CZzcArrayTree::TraverseTree(){for (int i= 0;i < m_nSize;i++){cout<<m_pTree[i]<<" ";}cout<<endl;}void CZzcArrayTree::TraverseDel(int NodeIndex){if (NodeIndex < 0|| NodeIndex >= m_nSize) return;if (NodeIndex * 2 + 1 < m_nSize)//左子节点符合{m_pTree[NodeIndex * 2 + 1] = 0;TraverseDel( NodeIndex * 2 + 1);}if (NodeIndex * 2 + 2 < m_nSize)//右子节点符合{m_pTree[NodeIndex * 2 + 2] = 0;TraverseDel( NodeIndex * 2 + 2);}}
阅读全文
0 0
- 数组形式二叉树之C++封装
- 链表形式二叉树之C++封装
- 数据结构C语言实现之循环队列----数组形式---简单化
- C常见问题之字符串的数组形式与指针形式的区别
- 二叉树数组实现[C/C++]代码
- 数据结构之二叉树(数组)
- 树状形式打印二叉树
- [c++]基于数组的二叉树遍历
- c语言构造数组二叉树
- C语言二叉树结构数组法
- [C++]封装排序二叉树&随机数生成(c++11)
- 数据结构之二叉树 使用数组实现
- 数据冒险之二叉树(数组)
- C语言中的指针,数组,指针数组, 数组形式参数
- OOP之封装 【C#】
- OOP之封装 【C#】
- 关于一个简单shellcode封装成C语言的形式
- 字典树数组形式写法
- 41-所有和为s的连续正数序列/递增数列中和为s的两个数字
- POJ
- WIN10上的Anaconda教程
- linux企业部分 varnish
- POJ
- 数组形式二叉树之C++封装
- synchronized关键字的使用
- 配置varnish服务
- 深入研究Struts2(三)---准备Struts2的学习和开发环境
- 关于eventmachine,协程在rails里面的使用
- 单链表的测长和打印和节点查找、插入、删除、逆置
- 【图论经典题】Prison Break
- 快捷键 变量 内外类 加号重载20170719
- java程序员的python之路(线程)