/*
二叉树的相关实现 ------顺序表存储
二叉树的性质
1:二叉树k层含有的节点数为 2^k-1 (k从一开始计数)
2:为k层的二叉树最多含有的节点数是 2^(k-1) (k从一开始计数)
3:对于任意的二叉树而言 都有n0 = n2+1 (n0表示出度为为0的节点,n2表示出度为2的节点)
证明: 求二叉树的总的节点数
n = n1+n2+n0;
n = n1+2*n2+1;
从上述莲师推理得到结果
4:对于完全二叉树 含有n节点的二叉树的深度是 [log2n]+1
5:对于含有n个节点的完全二叉树
a: 从1开始从上到下并从左到右的顺序进行编号,
当编号为i的节点满足 2*i <= n 表示编号为i的节点好友左孩子
当编号为i的节点满足 2*i+1 <= n 表示编号为i的节点含有左右孩子
如果从0开始编号 就将相应的i替换为(i+1)
*/
#include <iostream>
#include <queue>
using namespace std;
typedef struct node{
int value ;
struct node *left,*right;
}BTree;
void CreateBTree(int *arr,int length,BTree* &node_arr)
{
node_arr = new BTree[length];
for(int i=0;i<length;i++){
node_arr[i].value = arr[i];
node_arr[i].left = NULL ; node_arr[i].right = NULL;
}
for(int i=0;i <= length/2-1 ;i++){ /*连接拥有左孩子的节点*/
node_arr[i].left = &node_arr[2*i+1];
}
for(int i=0;i <= (length-3)/2 ;i++){ /*连接拥有右孩子的节点*/
node_arr[i].right = &node_arr[2*i+2];
}
}
void display_s(BTree *tree) /*深度遍历(先序遍历)*/
{
if(tree == NULL) return ;
cout<<tree->value<<" ";
display_s(tree->left);
display_s(tree->right);
}
void display_g(BTree *tree) /*广度遍历(层次遍历) 使用队列辅助实现*/
{
if(tree == NULL) return ;
queue<BTree*> qu;
BTree* node = NULL;
qu.push(tree);
while(!qu.empty()){
node = qu.front();
cout<<node->value<<" ";
if(node->left){
qu.push(node->left);
}
if(node->right){
qu.push(node->right);
}
qu.pop();
}
}
int main()
{
int arr[] = {0,1,2,3,4,5};
BTree* tree= NULL;
CreateBTree(arr,sizeof(arr)/sizeof(int),tree);
display_s(tree);
cout<<endl<<"-----------------------我是分割线-----------------------------"<<endl;
display_g(tree);
cout<<endl;
system("pause");
return 0;
}