定义:二叉树是另一种树形结构,它的特点是每个结点至多只有两棵子树(即二叉树中的度大于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