二叉樹以中序為資料, 先序或者後序為根, 建立二叉樹
阿新 • • 發佈:2018-11-22
#include<iostream> using namespace std; struct Tree{ int v; Tree *left, *right; }; Tree *create_node(int v){ Tree *node = new Tree; node->v = v; node->left = node->right = NULL; return node; } // 中序 後序 Tree *mid_post(int *mid, int *post, int N){ int pos = 0; for( pos = 0; pos<N; pos++){ if(mid[pos] == post[N-1]) break; } if(pos == N){ for(int i = 0 ;i<N; i++) cout<<mid[i]<<" "; cout<<" "; for(int i = 0 ;i<N; i++) cout<<post[i]<<" "; cout<<"沒有與"+post[N-1]<<"相等價的值"<<endl; } Tree *node = create_node(post[N-1]); // 左樹存在 if(pos > 0){ node->left = mid_post(mid, post, pos); } // 右樹存在 if(N-pos-1 > 0){ node->right = mid_post(mid+pos+1, post+pos, N-pos-1); } return node; } // 中序 先序 Tree *mid_pre(int *mid, int *pre, int N){ int pos = 0; for( ; pos<N; pos++){ if(mid[pos] == pre[0]) break; } if(pos == N){ cout<<"mid中沒有與"+ pre[0] << "匹配的項" << endl; return NULL; } Tree *node = create_node(mid[pos]); if(pos > 0){ node->left = mid_pre(mid, pre+1, pos); } if(N - pos - 1 > 0){ node->right = mid_pre(mid+pos+1, pre+pos+1, N-pos-1); } return node; } // 中序 輸出 void mid_order(Tree *node){ if(node != NULL){ if(node->left != NULL) mid_order(node->left); cout<<node->v<<" "; if(node->right != NULL) mid_order(node->right); } } // 先序 輸出 void pre_order(Tree *node){ if(node != NULL){ cout<<node->v<<" "; if(node->left != NULL) pre_order(node->left); if(node->right != NULL) pre_order(node->right); } } // 後序 輸出 void post_order(Tree *node){ if(node != NULL){ if(node->left != NULL) post_order(node->left); if(node->right != NULL) post_order(node->right); cout<<node->v<<" "; } } int main(){ int len = 7; //int mid[] = {3, 2, 1, 4, 5, 7 , 6}; //int post[] = {3, 1, 2, 5, 6, 7, 4}; //Tree *root = mid_post(mid, post, len); //mid_order(root); int mid[] = {1, 2, 3, 4, 5, 6, 7}; int pre[] = {4, 2, 1, 3, 5, 7, 6 }; Tree *root = mid_pre(mid, pre, len); post_order(root); cin>>len; return 0; }