关于二叉树的三种遍历方式

首先我们定义了一个结构体 node,结构体内有用来存放数据的data和指针 left 和 right 。

struct node
{
	int data;
	struct node * rigth, *left;
};
typedef struct node TreeNode;

 定义完结构体后,先定义一个数组,用来存放结点内容,那我们就要先创建这么多的结点。

TreeNode *CreateTree(int *a)
{
	int i;
	TreeNode  * node[11] = {0};  //比循环多定义一个,防止不足。
	
	for(i = 0; i < 10; i++)
	{
		node[i] = (TreeNode *) malloc (sizeof(TreeNode)); //为结点结构体分配空间
		if(NULL == node[i])
		{
			printf("malloc error!\n");
		}
		node[i]->data = a[i];   //初始化
		node[i]->rigth = NULL;  
		node[i]->left = NULL;
	}
	for(i = 0;i < 10 / 2; i++)
	{
		node[i]->left = node[ 2 * i + 1];   //根据公式可以推算,公式详细请见下面
		node[i]->rigth = node[ 2 * i + 2];
	}
	return node[0];
}

main函数

int main()
{
	int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
	TreeNode *root;
	
	root = CreateTree(a);
	Pre0rder(root);
	printf("\n");
	In0rder(root);
	printf("\n");
	Post0rder(root);
	printf("\n");
	
	return 0;
}

!前序遍历!

int Pre0rder (TreeNode *T)
{
	if(NULL == T)
	{
		return 1;
	}
	
	printf("%d ",T->data);
	Pre0rder(T->left);
	Pre0rder(T->rigth);
	
	return 0;	
}

!中序遍历!

int In0rder (TreeNode *T)
{
	if(NULL == T)
	{
		return 1;
	}
	
	In0rder(T->left);
	printf("%d ",T->data);
	In0rder(T->rigth);
	
	return 0;	
}

!后续遍历!

int Post0rder (TreeNode *T)
{
	if(NULL == T)
	{
		return 1;
	}
	
	Post0rder(T->left);
	Post0rder(T->rigth);
	printf("%d ",T->data);
	return 0;	
}

输出结果:

二叉树的性质:


  1. 在二叉树的第i层至多有2^(i-1)个结点
  2. 深度为k的二叉树至多有2^k-1个结点
  3. 对任何一颗二叉树T,如果其终端结点数为n,度为2的结点数为m,则n=m+1
  4. 具有n个结点的完全二叉树的深度为  log2(n)+1
  5. 如果对 1 棵有 n 个结点的二叉树的结点按层序编号,对任一结点 i:(1)如果 i = 1,则结点 i 是二叉树的根,无双亲,如果 i > 1 , 则其双亲是结点 ( i / 2)(2) 如果 2i > n, 则结点 i 无左孩子,否则, 其左孩子是  2i (3) 如果 2i + 1 > n, 则结点 i 无右孩子;否则其右孩子是结点 2i + 1

猜你喜欢

转载自blog.csdn.net/wow66lfy/article/details/81569082