树3 Tree Traversals Again(C++)

树3 Tree Traversals Again(C++)
#题目
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

#C++代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

typedef struct Node List;
struct Node
{
	int Data;
	struct Node* Lchild;
	struct Node* Rchild;
};
List* CreatNode(int Data)
{
	List* list = new List;
	list->Data = Data;
	list->Lchild = NULL;
	list->Rchild = NULL;
	return list;
}


int main()
{
	int n = 0;
	cin >> n;
	vector<List*> stack;//创建堆栈
	string s;
	List* temp = NULL;
	int t = 0;
	List* head = NULL;
	for(int i=0;i<2*n;i++)		//读取数据并生成一个二叉树
	{
		cin >> s;
		if (s == "Push")
		{
			cin >> t;
			if (temp != NULL)
			{
				if (temp->Lchild == NULL)
				{
					temp->Lchild = CreatNode(t);
					stack.push_back(temp->Lchild);
					temp = temp->Lchild;
				}
				else if (temp->Rchild == NULL)
				{
					temp->Rchild = CreatNode(t);
					stack.push_back(temp->Rchild);
					temp = temp->Rchild;
				}
			}
			else {
				temp = CreatNode(t);
				stack.push_back(temp);
				head = temp;
			}
		}
		if (s == "Pop")
		{
			temp = stack.back();
			stack.pop_back();
		}
	}
	vector<int> res;	
	List* p;
	p = head;
	while (p != NULL || stack.size() != 0)	//用根->右->左的方式遍历二叉树,生成一个逆序的后序遍历数组
	{
		while (p != NULL)
		{
			res.push_back(p->Data);
			stack.push_back(p);
			p = p->Rchild;
		}
		if (stack.size() != 0)
		{
			p = stack.back();
			stack.pop_back();
			p = p->Lchild;
		}
	}
	reverse(res.begin(), res.end());		//逆序排列
	for (vector<int>::iterator it = res.begin(); it != res.end(); it++)	//输出
	{
		cout << *it;
		if (it != res.end() - 1)
			cout << " ";
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值