一下代碼是二叉樹的相關代碼、包括二叉樹的根據前序遍歷創建二叉樹。根據前序遍歷、中序遍歷與後續遍歷依次查找二叉樹的各個節點。
#include<stdio.h>
//定義二叉樹節點數據類型
typedef struct bitnode
{
int data; //存儲數據結點
struct bitnode *left, *right; //存儲該結點的左右子樹指針
} bitnode, *bitree; //bitree爲指向bitnode這種結構的指針
//前序構造二叉樹函數
bitnode* PerCreateTree( )
{
bitnode* T;
int item;
scanf("%d",&item);
if( item == 0) //葉節點數據標誌:其後根兩個0
T = NULL; //若某一節點爲葉子結點,則其左右子樹均爲NULL,0表示建空樹
else
{
T = (bitnode*)malloc(sizeof(bitnode));
T->data = item;
T->left = PerCreateTree(); //遞歸創建其左子樹
T->right = PerCreateTree(); //遞歸創建其右子樹
}
return T; //返回根節點
}
//前序序遍歷二叉樹函數
void PerOrder(bitnode* T)
{
if( T ) // T != NULL
{
printf("%d ",T->data); // 訪問根節點的數據域
PerOrder(T->left); // 遞歸先序遍歷其左子樹
PerOrder(T->right); // 遞歸先序遍歷其右子樹
}
}
//後序遍歷二叉樹函數
void hou(bitree T)
{
if( T ) // T != NULL
{
hou(T->left); //遞歸先序遍歷其左子樹
hou(T->right); //遞歸先序遍歷其右子樹
printf("%d ",T->data); // 訪問根節點的數據域
}
}
//中序遍歷二叉樹函數
void zhong(bitree T)
{
if( T ) // T != NULL
{
hou(T->left); //遞歸先序遍歷其左子樹
printf("%d ",T->data); // 訪問根節點的數據域
hou(T->right); //遞歸先序遍歷其右子樹
}
}
void InOrder(bitnode *root){
if(root==NULL) return;
else{
InOrder(root->left);
printf("%d",root->data);
InOrder(root->right);
}
}
//設計算法求二叉樹的節點個數
int count =0;
int Count(bitnode *root){
if(root==NULL)return 0;
else{
Count(root->left);
count++;
Count(root->right);
}return count;
}
//按前序次序打印二叉樹中的葉子節點
void PreOrder(bitnode *root){
if(root==NULL) return;
else{
if(!root->left&&!root->right)
printf("%d ",root->data);
PreOrder(root->left);
PreOrder(root->right);
}
}
int main()
{
bitnode* root;
printf("請輸入數據前序創建一棵二叉樹:\n");
root = PerCreateTree(); //先序創建一棵二叉樹
printf("前序遍歷的結果:");
PerOrder(root); //先序遍歷
printf("\n");
printf("後序遍歷的結果:");
hou(root); //後序遍歷
printf("\n");
printf("中序遍歷的結果:");
zhong(root); //後序遍歷
printf("\n");
Count(root);
printf("二叉樹的節點個數:%d",count);
printf("\n");
printf("二叉樹中的葉子節點:");
PreOrder(root);
printf("\n");
return 0;
}