#pragma once
#include<iostream>
using namespace std;
#define Maxsize 100
enum NODE
{
E_Root,
E_Lchild,
E_Rchild,
};
template<class T>
struct TreeNode
{
T data;
bool isVaild;
};
template<class T>
class Tree
{
public:
Tree()
{
for (int i = 0; i <= Maxsize; i++)
{
Tree_data[i].isVaild = false;
}
}
~Tree() {}
public:
int createNode(int parindex, NODE pointSign, const T& e);
int getParentindex(int sonindex)
{
if (ifVaildIndex(sonindex) == false)
return -1;
if (Tree_data[sonindex].isVaild == false)
return -1;
return int(sonindex / 2);
}
int getPointLevel(int index)
{
if (ifVaildIndex(index) == false)
return -1;
if (Tree_data[index].isVaild == false)
return -1;
int level = int(log(index) / log(2)) + 1;
return level;
}
int getLevel()
{
if (Tree_data[1].isVaild == false)
return 0;
int i=-5;
for (int i = Maxsize; i >= 1; i--)
{
if (Tree_data[i].isVaild == true)
break;
}
return getPointLevel(i);
}
bool ifCompeleteTree()
{
if (Tree_data[1].isVaild == false)
return false;
int i=-5;
for (int i = Maxsize; i >= 1; i--)
{
if (Tree_data[i].isVaild == true)
break;
}
for (int k = 1; k <= i; k++)
{
if (Tree_data[k].isVaild == false)
return false;
}
return true;
}
void preOrder()
{
if (Tree_data[1].isVaild == false)
return;
preOrder(1);
}
void preOrder(int index)
{
if (ifVaildIndex(index) == false)
return;
if (Tree_data[index].isVaild == false)
return;
cout << (char)Tree_data[index].data << " ";
preOrder(2 * index);
preOrder(2 * index+1);
}
private:
bool ifVaildIndex(int index)
{
if (index<1 || index>Maxsize)
return false;
return true;
}
private:
TreeNode<T> Tree_data[Maxsize+1];
};
template<class T>
int Tree<T>::createNode(int parindex, NODE pointSign, const T& e)
{
if (pointSign != E_Root)
{
if (ifVaildIndex(parindex) == false)
return -1;
if (Tree_data[parindex].isVaild == false)
return -1;
}
int index = -1;
if (pointSign == E_Root)
{
index = 1;
}
else if(pointSign== E_Lchild)
{
index = 2 * parindex;
if (ifVaildIndex(index) == false)
return -1;
}
else if (pointSign == E_Rchild)
{
index = 2 * parindex+1;
if (ifVaildIndex(index) == false)
return -1;
}
Tree_data[index].data = e;
Tree_data[index].isVaild = true;
return index;
}
#include"Tree.hpp"
void test1()
{
Tree<int>t;
int indexroot = t.createNode(-1, E_Root, 'A');
int indexNodeB = t.createNode(indexroot, E_Lchild, 'B');
int indexNodeC = t.createNode(indexroot, E_Rchild, 'C');
int indexNodeD = t.createNode(indexNodeB, E_Lchild, 'D');
int indexNodeE = t.createNode(indexNodeC, E_Rchild, 'E');
int parIndexE = t.getParentindex(indexNodeE);
cout << "E的父节点下标:" << parIndexE << endl;
int level = t.getPointLevel(indexNodeD);
cout << "D的高度: " << level << endl;
level = t.getPointLevel(indexNodeE);
cout << "E的高度: " << level << endl;
cout << "树的高度: " << t.getLevel()<< endl;
cout << "是否为完全二叉树:" << (t.ifCompeleteTree() == true ? "是" : "否") << endl;
t.preOrder();
}
int main()
{
test1();
system("pause");
return 0;
}