c二叉樹
阿新 • • 發佈:2018-12-09
#include<iostream> #include<stdlib.h> using namespace std; typedef char ElemType; //二叉樹的二叉連結串列結構,也就是二叉樹的儲存結構,1個數據域,2個指標域(分別指向左右孩子) typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; //二叉樹的建立,按前序遍歷的方式建立二叉樹,當然也可以以中序或後序的方式建立二叉樹 void CreateBiTree(BiTree *T) { ElemType ch; cin >> ch; if (ch == '#') *T = NULL; //保證是葉結點 else { *T = (BiTree)malloc(sizeof(BiTNode)); //if (!*T) //exit(OVERFLOW); //記憶體分配失敗則退出。 (*T)->data = ch;//生成結點 CreateBiTree(&(*T)->lchild);//構造左子樹 CreateBiTree(&(*T)->rchild);//構造右子樹 } } //表示對遍歷到的結點資料進行的處理操作,此處操作是將樹結點前序遍歷輸出 void operation1(ElemType ch) { cout << ch << " "; } //此處在輸出的基礎上,並輸出層數 void operation2(ElemType ch, int level) { cout << ch << "在第" << level << "層" << endl; } //遞迴方式前序遍歷二叉樹 void PreOrderTraverse(BiTree T, int level) { if (T == NULL) return; /*此處表示對遍歷的樹結點進行的操作,根據你自己的要求進行操作,這裡只是輸出了結點的資料*/ //operation1(T->data); operation2(T->data, level); //輸出了層數 PreOrderTraverse(T->lchild, level + 1); PreOrderTraverse(T->rchild, level + 1); } //遞迴方式中序遍歷二叉樹 void InOrderTraverse(BiTree T,int level) { if(T==NULL) return; InOrderTraverse(T->lchild,level+1); //operation1(T->data); operation2(T->data, level); //輸出了層數 InOrderTraverse(T->rchild,level+1); } //遞迴方式後序遍歷二叉樹 void PostOrderTraverse(BiTree T,int level) { if(T==NULL) return; PostOrderTraverse(T->lchild,level+1); PostOrderTraverse(T->rchild,level+1); //operation1(T->data); operation2(T->data, level); //輸出了層數 } int main() { int level = 1; //表示層數 BiTree T = NULL; cout << "請以前序遍歷的方式輸入擴充套件二叉樹:"; //類似輸入AB#D##C## CreateBiTree(&T);// 建立二叉樹,沒有樹,怎麼遍歷 cout << "遞迴前序遍歷輸出為:" << endl; PreOrderTraverse(T, level);//進行前序遍歷,其中operation1()和operation2()函式表示對遍歷的結點資料進行的處理操作 cout << endl; cout << "遞迴中序遍歷輸出為:" << endl; InOrderTraverse(T, level); cout << endl; cout << "遞迴後序遍歷輸出為:" << endl; PostOrderTraverse(T, level); cout << endl; return 0; }