L2-011. 玩轉二叉樹
阿新 • • 發佈:2017-08-13
玩轉 evel pop namespace problem 給定 wap emp clu
給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裏假設鍵值都是互不相等的正整數。
輸入格式:
輸入第一行給出一個正整數N(<=30),是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字間以空格分隔。
輸出格式:
在一行中輸出該樹反轉後的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多余空格。
輸入樣例:7 1 2 3 4 5 6 7 4 1 3 2 6 5 7輸出樣例:
4 6 1 7 5 3 2
當左右子樹都存在時進行交換即可。
代碼:
#include <iostream> #include <cstdio> #include <cstdlib> #include <stack> #include <queue> using namespace std; int z[30],q[30]; class Tree { public: int data; Tree *lchild; Tree *rchild; Tree() { lchild=NULL; rchild=NULL; } }*root; Tree *CreatNode() { Tree *root=new Tree(); return root; } Tree *RestoreTree(int q1,int q2,int z1,int z2) { Tree *root=CreatNode(); root->data=q[q1]; for(int i=0;z1+i<=z2;i++) { if(z[z1+i]==q[q1]) { if(i!=0)root->lchild=RestoreTree(q1+1,q1+i,z1,z1+i-1); if(i+z1!=z2)root->rchild=RestoreTree(q1+i+1,q2,z1+i+1,z2); break; } } if(root->lchild&&root->rchild)swap(root->lchild,root->rchild); return root; } void levelOrder(Tree *root) { queue<Tree *>q; q.push(root); cout<<root->data; while(!q.empty()) { if(q.front()->lchild) { q.push(q.front()->lchild); cout<<‘ ‘<<q.front()->lchild->data; } if(q.front()->rchild) { q.push(q.front()->rchild); cout<<‘ ‘<<q.front()->rchild->data; } q.pop(); } } int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>z[i]; for(int i=0;i<n;i++) cin>>q[i]; root=RestoreTree(0,n-1,0,n-1); levelOrder(root); return 0; }
L2-011. 玩轉二叉樹