【Tsinghua】樹重建(Rebuild)
這道題就是各種順序的遍曆一棵樹。。。
樹重建(Rebuild)
描述
某二叉樹的n個節點已經用[1, n]內的整數進行了編號。現給定該二叉樹的中序遍曆序列和後序遍曆序列,試輸出其對應的先序遍曆序列。
輸入
第一行為一個整數n。
第二、三行,即已知的中序、後序遍曆序列。
輸出
僅一行。
若所給的中序、後序遍曆序列的確對應於某棵二叉樹,則輸出其先序遍曆序列。否則,輸出-1。
輸入樣例1
5
4 2 5 1 3
4 5 2 3 1
輸出樣例1
1 2 4 5 3
輸入樣例2
3
2 3 1
1 2 3
輸出樣例2
-1
限製
1 ≤ n ≤ 5000
時間:2 sec
空間:256MB
輸入和輸出的遍曆序列均為[1, n]內整數的一個排列,整數間均以空格分隔,行末沒有多餘空格。
提示
不同遍曆序列中根節點的位置。
AC的代碼:
#include <stdio.h> #include <stdlib.h> #define MAXN 5005 int in[MAXN]; //中序 int af[MAXN]; //後序 int ans[MAXN]; //最後輸出的前序序列 int count=0; struct TreeNode { struct TreeNode* left; struct TreeNode* right; int elem; }; TreeNode* BinTree(int inorder[], int aftorder[], int length) { if(length == 0) { return NULL; } TreeNode* node = new TreeNode; //新建一個樹節點 node->elem = *(aftorder+length-1); ans[count++]=node->elem; //存入答案 int rootIndex=0; for( ;rootIndex<length;rootIndex++) //在中序遍曆中找這個根節點 { if(inorder[rootIndex]==*(aftorder+length-1)) break; } if(rootIndex>=length) { printf("-1\n"); exit(0); } node->left = BinTree(inorder,aftorder,rootIndex); node->right = BinTree(inorder+rootIndex+1 , aftorder+rootIndex , length-(rootIndex+1)); return node; } int main() { int n; scanf("%d",&n); int i; for(i=0;i<n;i++) scanf("%d",&in[i]); for(i=0;i<n;i++) scanf("%d",&af[i]); BinTree(in,af,n); for(i=0;i<count-1;i++) printf("%d ",ans[i]); printf("%d\n",ans[i]); return 0; }
最後更新:2017-04-03 05:39:38
上一篇:
Firefox無法同步問題的解決
下一篇:
UILabel設置多種字體、顏色
VMware的“Intel VT-x is disabled”解決方法
確定不收藏?十張機器學習和深度學習工程師必備速查表!
Android開發6——布局中的wrap_content和fill_parent以及match_parent
Oracle中序列的操作以及使用前對序列的初始化
CUDA從入門到精通(三):必備資料
《Linux From Scratch》第二部分:準備構建 第五章:構建臨時文件係統- 5.29. Perl-5.20.2
動態規劃-循環數組的最大子數組和
C# WinForm中PreviewKeyDown、KeyDown、KeyPress、KeyUp區別與聯係
C# 文件,文件夾的操作
.NET中IO體係結構