二叉树数组存储:前序遍历、打印二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/83270847
// Study_Program.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <math.h>
#define SIZE 20
//求深度
//完全二叉树的最大节点数量s = (2^n)-1,n = 树的高度
//对于一个数组结构的tree,要先求tree的深度n,求最大指数2^n-1=size = 2^n = size+1 。所以 n =  log2 (size+1)。n向上取整
int getHeight2(int size){
	return (int)ceil(log10((double)size+1)/log10(2.0));
}

//求左孩子
int *getLchild(int arr[],int index){
	if(index*2 > SIZE){
		//printf("this node is not lift child");
		return NULL;
	}
	return &arr[index*2];
}

//求右孩子
int *getRchild(int arr[],int index){
	if(index*2+1 > SIZE){
		//  printf("this node is not right child");
		return NULL;
	}
	return &arr[index*2+1];
}

//求双亲
int *getParent(int arr[],int index){
	if(index < 2 || index > SIZE){
		printf("this node is not parent");
		return NULL;
	}
	return &arr[index/2];
}

//先序遍历
void perorder2(int *arr, int index){

	printf("%d  ",arr[index]);
	if(getLchild(arr,index) != NULL)
		perorder2(arr,index*2);

	if(getRchild(arr,index) != NULL)
		perorder2(arr,index*2+1);
}

//先序遍历二叉树
void PreOderTravelsel(int* arr,int index,int len)
{
	printf("%d ",arr[index]);
	//访问左子树
	if (index*2<=len)
	{
		PreOderTravelsel(arr,index*2,len);
	}
	//访问右子树
	if (index*2+1<=len)
	{
		PreOderTravelsel(arr,index*2+1,len);
	}
}

//打印空格
void printCH(int k){
	char *ch = " ";

	while(k){
		printf("%s",ch);
		k--;
	}
}

//print tree
//打印tree,这样有直观的感受,按层打印
void printTerr(int arr[]){

	int tall = getHeight2(SIZE);//树的高度,层数

	int count = 0,length = 1, i;//换行计数

	int k;//元素间距
	//k 的值用于控制tree node 间距,当从root节点向下打印时, k是递减的,k的递减规律是: n = (n+1) - 2^n ;(n 是当前层数,n-1表示上一层,root的层数n = 数的高度,n从叶子(最末端)向根节点计数.2^n == 1<<n)
	k = (1 << (tall+1)) - 1;
	k = k - (1 << tall);
	for(i = 1; i <= SIZE; i++){

		printCH(k);//打印空格方法
		printf("%d",arr[i]);//打印元素,每个元素前后要打印空格.
		printCH(k);
		count++;
		//判断是否打印空格,调整层数
		if(count == length){
			printf("\n\n");

			count = 0;
			length *=2;

			tall--;
			k = k - (1 << tall);
		}
	}
	printf("\n");
}

//test tree for array
void treeArrsTest(){
	//int treeArr[] = {NULL,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
	int treeArr[] = {NULL,19,20,13,14,15,16,17,18,9,10,11,12,3,4,5,6,7,8,1,2};
	//先把tree打印出来,这样比较直观一点
	printTerr(treeArr);
	printf("\n");
	perorder2(treeArr, 1);
	printf("\n");
	PreOderTravelsel(treeArr,1,SIZE);
	printf("\n");
	printf(" node 5 left child is  : %d\n",*getLchild(treeArr,5));
	printf(" node 5 right child is 6 : %d\n",*getRchild(treeArr,5));
	printf(" node 5 parent is : %d\n",*getParent(treeArr,5));
}


int _tmain(int argc, _TCHAR* argv[])
{
	treeArrsTest();
	int a=0;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/haimianjie2012/article/details/83270847