本二叉树是索引0开始为头数据节点,则*2+1为其左孩子,*2+2为右孩子。数组中元素值为0该节点为空。代表亲测可运行。
Tree.h
#pragma once class Tree { public: Tree(const int &pRoot,int size);//传递初始头数据节点的值与容量 ~Tree(); int SearchNode(int nodeIndex); bool AddNode(int nodeIndex, bool direction, const int & pNode);//direction = false 表示左孩子,true表示右孩子 bool DeleteNode(int nodeIndex); void TreeTraverse(); private: int * m_pTree;//以索引0开始为头数据节点 int m_iSize;//记录二叉树大小 };
Tree.cpp
#include<iostream> #include"Tree.h" using namespace std; Tree::Tree(const int &pRoot,int size) { m_iSize = size; m_pTree = new int[size]; for (int i = 0; i < size; i++) m_pTree[i] = 0; m_pTree[0] = pRoot; } Tree::~Tree() { delete[] m_pTree; } int Tree::SearchNode(int nodeIndex) { if (nodeIndex < 0 || nodeIndex >= m_iSize) return NULL; if (m_pTree[nodeIndex] == 0) return NULL; return m_pTree[nodeIndex]; } bool Tree::AddNode(int nodeIndex, bool direction,const int & pNode) { if (nodeIndex < 0 || nodeIndex >= m_iSize) return false; if (m_pTree[nodeIndex] == 0) return false; if (!direction)//插入左孩子 { if (nodeIndex * 2 + 1 >= m_iSize)//越界 return false; if (m_pTree[nodeIndex * 2 + 1] != 0)//本身已有左节点 return false; m_pTree[nodeIndex * 2 + 1] = pNode; } if (direction)//插入右孩子 { if (nodeIndex * 2 + 2 >= m_iSize)//越界 return false; if (m_pTree[nodeIndex * 2 + 2] != 0)//本身已有左节点 return false; m_pTree[nodeIndex * 2 + 2] = pNode; } return true; } bool Tree::DeleteNode(int nodeIndex) { if (nodeIndex < 0 || nodeIndex >= m_iSize) return false; if (m_pTree[nodeIndex] == 0) return false; m_pTree[nodeIndex] = 0; return true; } void Tree::TreeTraverse() { for (int i = 0; i < m_iSize; i++) { cout << m_pTree[i] << " "; } }
main.cpp
#include<iostream> #include"Tree.h" using namespace std; /*建立如图所示树 3(0) 5(1) 8(2) 2(3) 6(4) 9(5) 7(6) */ int main() { Tree * pTree = new Tree(3,10); pTree->AddNode(0, 0, 5); pTree->AddNode(0, 1, 8); pTree->AddNode(1, 0, 2); pTree->AddNode(1, 1, 6); pTree->AddNode(2, 0, 9); pTree->AddNode(2, 1, 7); //pTree->DeleteNode(5); pTree->TreeTraverse(); cout << endl; cout << "Node 5 value is : " << pTree->SearchNode(5) << endl; delete pTree; return 0; }