树———二叉树

定义:二叉树是另一种树形结构,它的特点是每个结点至多只有两棵子树(即二叉树中的度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。

二叉树的三种遍历方式:

先序遍历:遍历顺序规则为【根左右】

中序遍历:遍历顺序规则为【左根右】

后序遍历:遍历顺序规则为【左右根】

例:如上图先序遍历:a b d e c f g h i

     中序遍历:d b e a f h g i c

     后序遍历:d e b h i f c a 

二叉树的创建及遍历代码:

(用递归方法遍历)

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int nValue;
	struct node *pLeft;
	struct node *pRight;
}BinaryTree;


void RecCreate(BinaryTree **pTree)
{
	int nNum;
	scanf("%d",&nNum);

	if(nNum == 0)return;
	*pTree = (BinaryTree*)malloc(sizeof(BinaryTree));
	(*pTree)->nValue = nNum;

	(*pTree)->pLeft = NULL;
	(*pTree)->pRight = NULL;

	//左 右
	RecCreate(&((*pTree)->pLeft));
	RecCreate(&((*pTree)->pRight));
}
//按照数组的方式存储  比递归建立二叉树时间空间复杂度低  根据二叉树性质6:若从零开始给完全二叉树编号,则左孩子编号为2*i+1 ,右孩子编号为2*i+2,
且i的范围为0<=i<=n-1  且2*i+1<=n-1
BinaryTree *ArrToTree(int arr[],int nLength)
{
	if(arr == NULL || nLength <= 0)return NULL;

	//申请空间
	BinaryTree *pTree = NULL;
	pTree = (BinaryTree*)malloc(sizeof(BinaryTree)*nLength);

	//值 拷贝
	int i;
	for(i = 0;i<nLength;i++)
	{
		pTree[i].nValue = arr[i];
		pTree[i].pLeft = NULL;
		pTree[i].pRight = NULL;
	}

	//左右关联
	//父亲节点关联
	for(i = 0;i<= nLength/2 -1;i++)
	{
		if(2*i+1 <= nLength-1)
		{
			pTree[i].pLeft = &pTree[2*i+1];
		}
		if(2*i+2<=nLength-1)
		{
			pTree[i].pRight = &pTree[2*i+2];
		}
	}

	return pTree;
}


void PreOrderTrversal(BinaryTree *pTree)
{
	if(pTree == NULL)return;

	//根
	printf("%d ",pTree->nValue);

	//左
	PreOrderTrversal(pTree->pLeft);

	//右
	PreOrderTrversal(pTree->pRight);
}

int main()
{
	BinaryTree *pTree = NULL;
	//pTree = CreateBinaryTree();
	//RecCreate(&pTree);
	int arr[] = {1,2,3,4,5,6};
	pTree = ArrToTree(arr,sizeof(arr)/sizeof(arr[0]));
	PreOrderTrversal(pTree);
	printf("\n");
	return 0;
}

二叉树性质:

(1) 在二叉树中,第i层的结点总数不超过2^(i-1);

(2) 深度为h的二叉树最多有2^h-1个结点(h>=1),最少有h个结点;

(3) 对于任意一棵二叉树,其所有的叶结点数为:N0,而度为2的所有结点的数量为:N2,则:N0=N2+1,请观察上图;

(4) 具有n个结点的完全二叉树的深度为int(log2n)+1

(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:

若I为结点编号则 如果I<>1,则其父结点的编号为I/2;

如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子;

如果2*I+1<=N,则其右儿子的结点编号为2*I+1;若2*I+1>N,则无右儿子。

(6)给定N个节点,能构成h(N)种不同的二叉树。

h(N)为卡特兰数的第N项。h(n)=C(n,2*n)/(n+1)。

(7)设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i


猜你喜欢

转载自blog.csdn.net/aaa_cainiao_66666/article/details/79857552