本二叉树是索引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;
}
1284

被折叠的 条评论
为什么被折叠?



