資料結構6 && 實驗六:樹的操作
阿新 • • 發佈:2019-01-24
一、實驗目的及要求
⒈理解二叉樹的抽象資料型別的定義,及在C語言環境中的表示方法。
⒉理解二叉樹的基本操作的演算法,及在C語言環境中一些主要基本操作的實現。
⒊在C語言環境下實現二叉樹的應用操作:
①採用順序儲存建立一棵二叉樹。
②採用二叉連結串列儲存一棵二叉樹,並實現二叉樹的先序、中序、後序遍歷的遞迴演算法。
二、實驗內容
⒈理解二叉樹的抽象資料型別的定義,及在C語言環境中的表示方法。
⒉理解二叉樹的基本操作的演算法,及在C語言環境中一些主要基本操作的實現。
⒊在C語言環境下實現二叉樹的應用操作:
①採用順序儲存建立一棵二叉樹。
②採用二叉連結串列儲存一棵二叉樹,並實現二叉樹的先序、中序、後序遍歷的遞迴演算法。
二、實驗內容
經過對實驗目的及要求的分析,本實驗分為三個部分,分別為建立二叉樹、實現二叉樹的先序、中序、後序的遞迴演算法及二叉樹的中序的非遞迴演算法。
#include<cstdio> #include<algorithm> #include<queue> using namespace std; const int maxnode = 100000; struct ArrayTree { int node[maxnode]; int num; void create() { int n; scanf("%d",&n); num = n; for(int i = 1 ; i <= n ; ++ i) { scanf("%d",node+i); } } void print() { for(int i = 1 ; i <= num ; ++ i) { printf(" %d",node[i]); } printf("\n"); } }; struct node { struct node* left; struct node* right; int value; }; struct BiTree { node* root; node* getnode() { node *child = (node*)malloc(sizeof(node)); scanf("%d",&child->value); child->left = NULL; child->right = NULL; return child; } void create() { int n; scanf("%d",&n); queue<node*> q; root = (node*)malloc(sizeof(node)); scanf("%d",&root->value); q.push(root); int i = 1; while(i<n) { node *rt = q.front(); q.pop(); rt->left = getnode(); q.push(rt->left); i++; if(i>=n) break; rt->right = getnode(); q.push(rt->right); i++; } } }; void pre_order(node* root) { if(root==NULL) return; printf(" %d", root->value); if(root->left!=NULL) pre_order(root->left); if(root->right!=NULL) pre_order(root->right); } void in_order(node* root) { if(root->left!=NULL) in_order(root->left); if(root != NULL) printf(" %d",root->value); if(root->right!=NULL) in_order(root->right); } void post_order(node* root) { if(root->left!=NULL) post_order(root->left); if(root->right!=NULL) post_order(root->right); if(root != NULL) printf(" %d",root->value); } int main() { freopen("in","r",stdin); ArrayTree tmp; tmp.create(); printf("\n順序儲存完全二叉樹:"); tmp.print(); BiTree tree; tree.create(); printf("\n前序遍歷二叉樹:"); pre_order(tree.root); printf("\n中序遍歷二叉樹:"); in_order(tree.root); printf("\n後序遍歷二叉樹");post_order(tree.root); return 0; }