給定一顆二叉樹的中序和後序序列,要求按照zigzagging的方式輸出該二叉樹的層序遍歷算法
首先根據中序和後序遍歷序列創建該二叉樹,而後在層序遍歷中使用level記錄當前所在層次,每一次將當前層的全部結點都出隊到temp數組中,更新子節點的level併入隊,若是level是奇數就逆序temp,而後添加到ans數組中保存最終的層序遍歷結果,++level。最後輸出ans數組中的結果便可。數組
#include <cstdio> #include <queue> #include <vector> #include <algorithm> using namespace std; // 中序,後序和中序序列在in數組中的下標 int in[40],post[40],inIndex[40]; int n;// 頂點數目 vector<int> ans;// zigzagging層序遍歷序列 struct Node{ int v{}; int level{}; Node* left = nullptr; Node* right = nullptr; }; Node* createTree(int postL,int postR,int inL){ if(postL>postR){ return nullptr; } Node* root = new Node; root->v = post[postR]; // 獲取根節點在中序遍歷中的位置 int rootIndex = inIndex[root->v]; // 左子樹長度 int leftSize = rootIndex-inL; root->left = createTree(postL,postL+leftSize-1,inL); root->right = createTree(postL+leftSize,postR-1,rootIndex+1); return root; } // level爲偶數從左往右,爲奇數從右往左 void layerOrder(Node* root){ queue<Node*> que; root->level = 1; que.push(root); int level = 1; while (!que.empty()){ int len = que.size(); vector<int> temp; // 一次性遍歷每一層的結點,並保存在temp中 for(int i=0;i<len;++i){ Node* t = que.front(); que.pop(); if(t->left){ t->left->level = t->level + 1; que.push(t->left); } if(t->right){ t->right->level = t->level + 1; que.push(t->right); } temp.push_back(t->v); } // 層次爲奇數得逆序 if(level%2!=0){ reverse(temp.begin(),temp.end()); } for(auto v:temp){ ans.push_back(v); } ++level; } } int main() { scanf("%d",&n); for(int i=0;i<n;++i){ scanf("%d",&in[i]); inIndex[in[i]] = i; } for (int i = 0; i < n; ++i) { scanf("%d",&post[i]); } Node* root = createTree(0,n-1,0); layerOrder(root); for(int i=0;i<ans.size();++i){ printf("%d",ans[i]); if(i<ans.size()-1){ printf(" "); } } return 0; }