这道题乍看有点奇怪,感觉堆栈弹出的数字顺序比较特殊,在纸上写写画画,然后发现这是树的中序遍历。因为题目中讲“Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations”但是只有前序中序后序中的一种是不能唯一确定一棵二叉树的,至少需要两种才可以,并且题目要求输出树的后序遍历,所以大胆猜测可能堆栈的这些操作隐含了另一个次序(也就是前序)的遍历,仔细看入栈顺序,发现原来入栈顺序是前序遍历。 后面就很好办了,根据处理得到的前序遍历和中序遍历,对这棵二叉树进行重建,然后进行后序遍历就可以得到结果。
using node = struct Node; using tree = node * ; structNode { int data; tree left; tree right; };
voidread(vector<int>& pre, vector<int>& in){ stack<int> stk; int n, m; cin >> n; m = n * 2; while (m--) { string str;//"Push" or "Pop" cin >> str; if (str=="Push") { int a; cin >> a; pre.push_back(a); stk.push(a); } if (str=="Pop") { int p = stk.top(); stk.pop(); in.push_back(p); }
}
}
tree create(const vector<int>::iterator pre, const vector<int>::iterator in, int size){ if (size==0) { returnNULL; } elseif (size==1) { tree T = new node; T->data = *pre; T->left = NULL; T->right = NULL; return T; }
tree T = new node; int root = *pre; auto it = find(in, in+size, root); if (it == in + size) { throwexception("not find");//正常情况下是不应该找不到的,可以根据异常排查错误 } else { T->data = root; int newSize = it - in; //根节点到中序第一个节点的位置,获得左子树的节点数 T->left = create(pre+1,in,newSize ); T->right = create(pre+newSize+1, it+1, size -newSize-1); } return T; }
bool first =1; voidprintPostOrder(tree T){ if (T==NULL) { return; } if (T->left) printPostOrder(T->left); if (T->right) printPostOrder(T->right); if (!first) { cout << " "; } else { first = 0; } cout << T->data;