int main() { ifstream in("Stack1.cpp"); Stack1 textlines; // Try the different versions // Read file and store lines in the stack: string line; while(getline(in, line)) textlines.push(line + "\n"); // Print lines from the stack and pop them: while(!textlines.empty()) { cout << textlines.top(); textlines.pop(); } } ///:~
int main() { int InD[5010]; int PoD[5010];//将中序遍历序列和后续遍历序列放在InD和PoD中 int i, j , num; BinNode<int>* p = new BinNode<int>, *root, *q; Stack1 S1; p->data = -1; S1.push(p); scanf("%d", &num); for(i = 0; i < num; i++) scanf("%d", &InD[i]); for(i = 0; i < num; i++) scanf("%d", &PoD[i]); i = num - 1; j = num - 1; p = new BinNode<int>; p->data = PoD[i];//后续序列的最后一个节点为根节点,确定root; root = p; //p指向根节点 while(i >= 0 || j >= 0) { S1.push(p);//PoD[i]进栈 while(PoD[i] != InD[j])//而中序遍历序列中的最后一个节点为该二叉树最右下的节点InD[j],在存放中序序列的数组InD中找到该节点, { i--; p = new BinNode<int>; p->data = PoD[i]; S1.top()->rChild = p; //PoD[i-1]的右孩子为PoD[i] S1.push(p);//PoD[i]进栈 } S1.top()->rChild = NULL; //PoD[i]的右孩子为空 i--; j--; q = S1.pop(); //退栈 while((j >= 0) && (InD[j] == S1.top()->data)) { q->lChild = NULL; //q的左孩子为空 q = S1.pop(); j--; } if(i >= 0 || j >= 0) { p = new BinNode<int>; p->data = PoD[i]; //q的左孩子为PoD[i] q->lChild = p; } else q->lChild = NULL; } Stack1 S2; //辅助栈,利用中序遍历验证正确性 p = root; i = 0; while (true) if (p) { S2.push(p); //根节点进栈 p = p->lChild; //深入遍历左子树 } else if (!S2.empty()) { p = S2.pop(); //尚未访问的最低祖先节点退栈 if(p->data != InD[i]) { cout << -1; return 0; } p = p->rChild; //遍历祖先的右子树 i++; } else break; Stack1 S; //辅助栈 p = root; i = 0; if (p) S.push(p); //根节点入栈 while (!S.empty()) { //在栈变空之前反复循环 p = S.pop(); if(i < num - 1) { printf("%d ", p->data); //弹出并访问当前节点,其非空孩子的入栈次序为 i++; } else printf("%d", p->data); if (HasRChild(*p)) S.push(p->rChild); if (HasLChild(*p)) S.push(p->lChild); //先右后左 } }