03-树3 Tree Traversals Again (25 分)

这篇博客介绍了如何通过非递归方式使用栈实现对一个6节点二叉树的后序遍历,给出了输入操作序列和输出后序遍历序列的方法。通过示例展示了将栈操作转化为对应树结构的过程,并要求读者实现一个函数生成给定输入的后序遍历序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

03-树3 Tree Traversals Again (25 分)

An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.


Figure 1

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.

Output Specification:

For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop

Sample Output:

3 4 2 6 5 1

 

# include <iostream>
# include <stack>
# include <queue>
# include <string>
using namespace std;
vector<int>inorder;
vector<int>pre;
vector<int> postorder;
void print_postorder(int pre_l, int pre_r, int in_l, int in_r, int post_l, int post_r) {
	if (pre_l > pre_r)
		return;
	int n = pre_r - pre_l + 1;
	postorder[post_r] = pre[pre_l];
	post_r--;
	for (int i = in_l; i < in_l + n; ++i) {
		if (inorder[i] == pre[pre_l]) {
			print_postorder(pre_l + 1, pre_l + i - in_l, in_l, i - 1, post_l, post_l + i - in_l - 1);
			print_postorder(pre_l + i - in_l + 1, pre_r, i + 1, in_r, post_l + i - in_l, post_r);
			break;
		}
	}
}
int main() {
	int n;
	cin >> n;
	int m = 2 * n;
	stack<int>s;
	for (int i = 0; i < m; ++i) {
		string ss;
		int temp;
		cin >> ss;
		if (ss == "Push") {
			cin >> temp;
			s.push(temp);
			pre.emplace_back(temp);
		}
		else if(ss == "Pop"){
			inorder.emplace_back(s.top());
			s.pop();
		}
	}
	//现在v代表的是中序遍历序列
	//pre代表的是先序遍历序列
	postorder.resize(pre.size(), 0);
	print_postorder(0, pre.size() - 1, 0, inorder.size() - 1, 0, postorder.size() - 1);
	for (int i = 0; i < postorder.size(); ++i)
		if (i != postorder.size() - 1)
			cout << postorder[i] << " ";
		else
			cout << postorder[i] << endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值