二叉樹的實驗操作:
題目如下:
1.設某二叉樹的結點類型為整數類型,以二叉鏈表形式作為存儲結構。試編程實現:
(1) 生成一棵二叉樹.
(2) 用遞歸算法、非遞歸算法實現二叉樹的遍歷;
(3) 求度分別為0、1、2的結點的數目,分別用遞歸算法、非遞歸算法實現;
(4) 按層次遍歷二叉樹(提示:使用一個隊列實現);
*(5) 求二叉樹的高度(深度);
*(6) 判斷是否為完全二叉樹,輸出"Yes!"/"No!";
*(7) 交換每個結點的左右子樹;
*(8) 對交換左右子樹后的二叉樹作中序遍歷。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define ERROR
0
#define OK 1
#define OVERFLOW -2
#define queuesize 20
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild; //左右孩子指針
}BiTNode,*BiTree;
typedef struct Queue{
int front ,rear ;
BiTree data[queuesize]; //循環隊列元素類型為二叉鏈表結點指針
int count;
}Queue; //循環隊列結構定義
int CreateBiTree(BiTree * T) { //聲明的就是一個BiTree類型的指針,通過修改來對main中的T做修改,然后使其指向根結點
// 按先序次序輸入二叉樹中結點的值(一個字符),空格字符表示空樹,
// 構造二叉鏈表表示的二叉樹T。
int ch;
printf("請輸入一個根結點的值(如果為空,則輸入0)\n");
scanf("%d",&ch);
if (ch==0) (*T)= NULL;
else {
if (!(*T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
(*T)->data = ch; // 生成根結點
CreateBiTree(&(*T)->lchild); // 構造左子樹
CreateBiTree(&(*T)->rchild); // 構造右子樹
}
return OK;
} // CreateBiTree
int PreOrderTraverse(BiTree T) //用遞歸算法寫的遍歷函數,按照先序遍歷,同時輸出結點的值
{
if(T!=NULL)
{
printf("%d ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}
int InorderTraverse(BiTree T)
{
if(T!=NULL)
{
InorderTraverse(T->lchild);
printf("%d ",T->data);
InorderTraverse(T->rchild);
}
return OK;
}
int PreOrderTraverse2(BiTree T) //用非遞歸的算法寫的遍歷函數,按照先序遍歷,同時輸出結點的值
{
BiTree p,s[20];
int top=0;
p=T;
while((p!=NULL)||(top>0))
{
while(p!=NULL)
{
printf("%d ",p->data);
s[++top]=p;
p=p->lchild;
}
p=s[top--];
p=p->rchild;
}
return OK;
}
int get_all_node(BiTree T) //求出總的結點的個數
{
BiTree p,s[20];
int num_node=0;
int top=0;
p=T;
while((p!=NULL)||(top>0))
{
while(p!=NULL)
{
num_node++;
s[++top]=p;
p=p->lchild;
}
p=s[top--];
p=p->rchild;
}
return num_node;
}
int get_node0_1(BiTree T)//利用遞歸算法得到度為0的結點的個數
{
int num1,num2;