二叉查找树的创建
- 首先创建二叉树的结点的结构
//创建一颗二叉树结点的结构
typedef struct node{
int data; //数据域
struct node *right; //指向左子女的指针域
struct node *left; //指向右子女的指针域
}BTNode;
- 然后在创建二叉树
两指针联动:一个指针用于比较数据域大小,另一指针指向该子女的双亲结点。
函数形参变量是数组以及数组长度;返回值是根节点
//创建一颗二叉查找树(左子女比右子女大)
BTNode *CreatBTNode(int a[],int n)
{
BTNode *root,*pa,*c,*p;
root = (BTNode *)malloc(sizeof(BTNode));
root->data=a[0];
root->right=root->left=NULL;
int i;
for(i=1;i<n;i++)
{
p=(BTNode *)malloc(sizeof(BTNode));
p->data=a[i];
p->right=p->left=NULL;
c=root;
while(c)
{
pa=c;
if(c->data > p->data)
{
c=c->left;
}else{
c=c->right;
}
}
if(pa->data > p->data)
{
pa->left=p;
}else{
pa->right=p;
}
}
return root;
}
前序遍历 、中序遍历以及后序遍历##
前序遍历
思想:首先访问根节点;
再遍历左节点;
最后遍历右节点;代码:
//前序遍历
void FOrder(BTNode *root)
{
if(root)
{
printf("%5d",root->data);
FOrder(root->left);
FOrder(root->right);
}
}
中序遍历
思想:首先访问左节点;
再遍历根节点;
最后遍历右节点;代码:
//中序遍历
void InOrder(BTNode *root)
{
if(root)
{
InOrder(root->left);
printf("%5d",root->data);
InOrder(root->right);
}
}
后序遍历
思想:首先访问左节点;
再遍历右节点;
最后遍历根节点;代码:
//后序遍历
void POrder(BTNode *root)
{
if(root)
{
POrder(root->left);
POrder(root->right);
printf("%5d",root->data);
}
}
遍历算法的应用
- 叶子结点的个数
三种遍历算法都可以实现,关键在于在编历过程中,判断一个结点是否是叶子节点。
下面给出前序遍历实现的代码:
int leaf(BTNode *root)
{
int suml=0,sumr=0;
if(root)
{
if(!root->left && (!root->right))
{
return 1;
}
suml=leaf(root->left);
sumr=leaf(root->right);
}
return suml+sumr;
}
2.有左右子女结点的个数
三种遍历算法都可以实现,将访问操作改为累计数操作即可
下面给出前序遍历实现的代码:
//求有左右子女结点的个数
void parent(BTNode *root)
{
if(root)
{
if(root->left&&root->right)
{
count++; //count为全局变量
}
parent(root->left);
parent(root->right);
}
}
3.二叉树的高度
思想:若为空树,则高度为0,否则,树高应为左、右子树高度的最大值加1,此方法必须在左、右子树高度求出后,才可求出树的高度,因此只能用后序遍历
代码:
//求二叉树的高度
int PostTreeDepth(BTNode *root)
{
int hl,hr,h;
if(root)
{
hl=PostTreeDepth(root->left);
hr=PostTreeDepth(root->right);
h=(hl>hr? hl:hr)+1;
return h;
}else{
return 0;
}
}