二叉樹是比較特殊的樹,二叉樹的存儲方式有順序存儲和鏈式存儲,我們基本上都是用的鏈式存儲,
1.聲明結構體
typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild,*rchild; //左右孩子樹 }BiTNode,*BiTree;
2.創建二叉樹
采用遞歸的方式:這里采用的是按照先序序列建立二叉樹,
void createBiTree(BiTree *T) { char s; scanf("%c",&s); if(s=='$') { *T=NULL; } else { *T=(BiTNode*)malloc(sizeof(BiTNode)); //生成結點 if(!(*T)) { printf("申請空間失敗\n"); } (*T)->data=s; createBiTree(&(*T)->lchild); createBiTree(&(*T)->rchild); } }
所有的代碼如下:
#include<stdio.h> #include<stdlib.h> typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild,*rchild; //左右孩子樹 }BiTNode,*BiTree; //二叉樹的建立 按照先序遍歷建立 void createBiTree(BiTree *T) { char s; scanf("%c",&s); if(s=='$') { *T=NULL; } else { *T=(BiTNode*)malloc(sizeof(BiTNode)); //生成結點 if(!(*T)) { printf("申請空間失敗\n"); } (*T)->data=s; createBiTree(&(*T)->lchild); createBiTree(&(*T)->rchild); } } //二叉樹先序遍歷 void preorderVisit(BiTree T) //這里不要使用BiTNode *T , 不要直接對樹進行操作 { if(T) //先要進行判斷,只有結點不為空才會遍歷 { printf("%c ",T->data); preorderVisit(T->lchild); preorderVisit(T->rchild); } } //二叉樹中序遍歷 void middleVisit(BiTree T) //這里不要使用BiTNode *T , 不要直接對樹進行操作 { if(T) //先要進行判斷,只有結點不為空才會遍歷 { middleVisit(T->lchild); printf("%c ",T->data); middleVisit(T->rchild); } } //二叉樹后序遍歷 void postVisit(BiTree T) //這里不要使用BiTNode *T , 不要直接對樹進行操作 { if(T) //先要進行判斷,只有結點不為空才會遍歷 { postVisit(T->lchild); postVisit(T->rchild); printf("%c ",T->data); } } int main() { printf("請輸入二叉樹,按照先序遍歷,無字樹用$號表示\n"); BiTree T; createBiTree(&T); printf("先序遍歷結果如下:\n"); preorderVisit(T); printf("\n"); printf("中序遍歷結果如下:\n"); middleVisit(T); printf("\n"); printf("后序遍歷結果如下:\n"); postVisit(T); printf("\n"); }