请教一道面试题,关于tree的# JobHunting - 待字闺中A*12011-11-04 07:111 楼我刚去买了个oscar food steamer,26.99。最后一分钟决定买的。打算做baby food用。本来想买空气炸锅的,也没降价。
f*z2011-11-04 07:112 楼Given:Binary operators: +, *Operands: postive integersTree1: *|-----| |+ 3|---| |1 2First Array Representation Example:PreOrder: * + 1 2 3PostOrder: 1 2 + 3 *输入一个preorder字符串,有运算符和数字,输出postorder.请问如何实现?
t*e2011-11-04 07:115 楼听了leooo的推荐,如愿以偿买了food processor。顺带买了个包,把锅的预算花掉了。用。【在 A*********1 的大作中提到】: 我刚去买了个oscar food steamer,26.99。最后一分钟决定买的。打算做baby food用。: 本来想买空气炸锅的,也没降价。
f*z2011-11-04 07:116 楼能说具体点么?一个子树只有有子树没有左子树的情况怎么处理呢?诚心请教【在 v*****k 的大作中提到】: 用一组stack,扫描并记下从深到浅所有 * n n 或 + n n然后倒序打印
v*k2011-11-04 07:118 楼不可能啊。任何operator都一定有两个子树。否则算式怎么成立呢?PreOrder: * + 1 2 3PostOrder: 1 2 + 3 ** push stack 0+ push stack 1, null push stack 01 push stack 12 push stack 1stack 1 has 3 elements, back to stack 0, 3 push stack 0然后先打印stack 1 再打印stack 0 【在 f***z 的大作中提到】: 能说具体点么?: 一个子树只有有子树没有左子树的情况怎么处理呢?: 诚心请教
f*z2011-11-04 07:1110 楼那 + + 1 * 2 3 4呢?要启动几个stack? 与运算符个数相同? 如何决定4放在哪个stack已经怎么让1最先打印出来呢【在 v*****k 的大作中提到】: 不可能啊。任何operator都一定有两个子树。否则算式怎么成立呢?: PreOrder: * + 1 2 3: PostOrder: 1 2 + 3 *: * push stack 0: + push stack 1, null push stack 0: 1 push stack 1: 2 push stack 1: stack 1 has 3 elements, back to stack 0, 3 push stack 0: 然后先打印stack 1 再打印stack 0
A*12011-11-04 07:1111 楼什么牌子的food processor?等你谈感想。。。【在 t*****e 的大作中提到】: 听了leooo的推荐,: 如愿以偿买了food processor。: 顺带买了个包,把锅的预算花掉了。: : 用。
d*h2011-11-04 07:1112 楼按照这个写法,出来的postorder 是 2 1 + 3 *【在 v*****k 的大作中提到】: 不可能啊。任何operator都一定有两个子树。否则算式怎么成立呢?: PreOrder: * + 1 2 3: PostOrder: 1 2 + 3 *: * push stack 0: + push stack 1, null push stack 0: 1 push stack 1: 2 push stack 1: stack 1 has 3 elements, back to stack 0, 3 push stack 0: 然后先打印stack 1 再打印stack 0
M*n2011-11-04 07:1113 楼保质期=最佳食用时期。排在最佳食用期后面还有次佳食用期。超过保质期一段时间根本没事,不存放潮湿的地下室都没问题,国内店面买的馒头都是过期面粉做的,成本低,大家不都吃得活蹦乱跳的,过保质期一段时间no problem,不要太娇气。amazon 2012年的吃的东西都还在卖呢。【在 t*****e 的大作中提到】: 有保质期吗?
x*i2011-11-04 07:1114 楼一个stack就够了【在 v*****k 的大作中提到】: 不可能啊。任何operator都一定有两个子树。否则算式怎么成立呢?: PreOrder: * + 1 2 3: PostOrder: 1 2 + 3 *: * push stack 0: + push stack 1, null push stack 0: 1 push stack 1: 2 push stack 1: stack 1 has 3 elements, back to stack 0, 3 push stack 0: 然后先打印stack 1 再打印stack 0
l*s2011-11-04 07:1115 楼这个是干粮我还备两桶呢,10年没问题【在 M**********n 的大作中提到】: 保质期=最佳食用时期。排在最佳食用期后面还有次佳食用期。: 超过保质期一段时间根本没事,不存放潮湿的地下室都没问题,国内店面买的馒头都是: 过期面粉做的,成本低,大家不都吃得活蹦乱跳的,过保质期一段时间no problem,不: 要太娇气。: amazon 2012年的吃的东西都还在卖呢。
x*i2011-11-04 07:1118 楼贴一下我的code吧string pre2post(string pre){string temp, tmp_pos;int i = 0;stack ops;while (i < pre.size()){temp = pre.substr(i,1);if (pre[i]=='-' || pre[i]=='+' ||pre[i]=='*' || pre[i]=='/'){ ops.push(temp);}else {while (!ops.empty() &&!((tmp_pos=ops.top()).size()==1 &&(tmp_pos[0]=='-' || tmp_pos[0]=='+' ||tmp_pos[0]=='*' || tmp_pos[0]=='/'))){string t = tmp_pos;ops.pop();t.append(temp);t.append(ops.top());ops.pop();temp = t;}ops.push(temp);}i++;}if (!ops.empty())return ops.top();else {return "";}}int main(){string pre1="-+1*23/-456";cout<cout<return 0;}output:-+1*23/-456123*+45-6/-
n*w2011-11-04 07:1119 楼java写的。可以递归。public class recurivePre2Post {final static int MUL = -1;final static int ADD = -2;public static void main(String[] args){int[] expr1 = {MUL, ADD, 1, 2, 3};int[] expr2 = {ADD, ADD, ADD, ADD, 1, 2, 3, MUL, MUL, 4, 5, 6, 7};int[] expr3 = {MUL, 2, ADD, 1, MUL, 3, 4};convert(expr1, 0);System.out.println();convert(expr2, 0);System.out.println();convert(expr3, 0);}public static int convert(int[] expr, int index){if(index < 0 || expr == null || expr.length == 0) return -1;if(index == expr.length)return -1;int i = 0, e = expr[index];if(isOperator(e)){i = convert(expr, index+1); //print the first numberi = convert(expr, i+1); //print the second numberprintOperator(e); //print the operatorreturn i;}else{System.out.print(e + " ");return index;}}public static boolean isOperator(int e){if(e == ADD || e == MUL)return true;return false;}public static void printOperator(int e){if(e == MUL)System.out.print("* ");elseSystem.out.print("+ "); }}input:* + 1 2 3output:1 2 + 3 *input:+ + + + 1 2 3 * * 4 5 6 7output:1 2 + 3 + 4 5 * 6 * + 7 +input:* 2 + 1 * 3 4output:2 1 3 4 * + *【在 f***z 的大作中提到】: Given:: Binary operators: +, *: Operands: postive integers: Tree1: *: |: -----: | |: + 3: |: ---
r*n2011-11-04 07:1120 楼贴个tree的版本,不过空string对应空tree的时候,似乎空指针处理的有些ugly,求更简洁版本。struct BNode{char c;BNode* left;BNode* right;BNode():c(0){}; //avoid uninitialized value for cBNode(char _c):c(_c),left(NULL),right(NULL){};};void pre2bst(string pre, size_t& start, size_t len, BNode* &p){if(start{p=new BNode(pre[start]);size_t curr=start;start++;if(pre[curr]=='+'||pre[curr]=='-'||pre[curr]=='*'||pre[curr]=='/'){pre2bst(pre,start,len,p->left);pre2bst(pre,start,len,p->right);}elsereturn;}}void post_order(BNode* p){if(!p)return;if(!p->c)//handle empty treereturn;post_order(p->left);post_order(p->right);cout<c;}void pre2post(string pre){size_t len=pre.size();BNode* bst= new BNode();size_t begin=0;pre2bst(pre, begin, len, bst);post_order(bst);}void test_pre2post(){string tst[]={"*+123", "++*321/23", ""};size_t len=sizeof(tst)/sizeof(tst[0]);for(size_t i=0; i{cout<cout<pre2post(tst[i]);cout<}}【在 x***i 的大作中提到】: 贴一下我的code吧: string pre2post(string pre): {: string temp, tmp_pos;: int i = 0;: stack ops;: while (i < pre.size()): {: temp = pre.substr(i,1);: if (pre[i]=='-' || pre[i]=='+' ||
d*l2011-11-04 07:1121 楼void pre2post(){char c;while((c=cin.get())==' ');if(c < '0' || c > '9') {pre2post(); pre2post();}cout << c;}
c*e2011-11-04 07:1122 楼摆脱各位老大不要写那么长的code了,说明白思路就好了。【在 r******n 的大作中提到】: 贴个tree的版本,不过空string对应空tree的时候,似乎空指针处理的有些ugly,求更: 简洁版本。: struct BNode: {: char c;: BNode* left;: BNode* right;: BNode():c(0){}; //avoid uninitialized value for c: BNode(char _c):c(_c),left(NULL),right(NULL){};: };
n*w2011-11-04 07:1123 楼用递归很简洁的。如果a[i]是operator,从a[i+1]开始递归print左子树并返回左子树的最后一个元素的index。然后从a[index+1]开始print右子树,最后打印operator。伪码print(arr[], index){if(arr[index] is operator){i = print(arr, index+1);i = print(arr, i+1);print(arr[index]);return i;}else{print(arr[index]);return index;}}【在 c*****e 的大作中提到】: 摆脱各位老大不要写那么长的code了,说明白思路就好了。