数组形式二叉树之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);}}