博客
关于我
1086 Tree Traversals Again
阅读量:423 次
发布时间:2019-03-06

本文共 4550 字,大约阅读时间需要 15 分钟。

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 (≤) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2 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:

6Push 1Push 2Push 3PopPopPush 4PopPopPush 5Push 6PopPop
 

Sample Output:

3 4 2 6 5 1

 

题意:

采用非递归的方式来确定一颗二叉树,然后将这颗二叉树按照后序遍历的方式来输出。

思路:

这道题用到的理论知识就是通过一棵二叉树的先序遍历和中序遍历来构建这棵树,当然前提是你能够看出来进栈的序列是先序遍历的结果,出栈的序列是中序遍历的结果。构建树的代码(递归):

Node CreateTree(int left, int right){    if(left > right) return NULL;    int root = preOrder[cur];    cur++;    int rootIndex = findRootIndex(root);    Node T = new TreeNode();    T->num = root;    if(left != right){        T->left = CreateTree(left,rootIndex-1);        T->right = CreateTree(rootIndex+1,right);    }    return T;}

 

 

Code:

#include
#include
#include
using namespace std;typedef struct Node *node;struct Node { int value; node leftSon; node rightSon; node father; Node():value(), leftSon(), rightSon(), father(){}};void postOrder(node h) { if (h != NULL) { postOrder(h->leftSon); postOrder(h->rightSon); cout << h->value << " "; }}int main() { int n; cin >> n; getchar(); string str, op, num; int pos; queue
q; stack
s; stack
leftOrRight; for (int i = 0; i < n*2; ++i) { getline(cin, str); if (str[1] == 'u') { pos = str.find(' '); op = str.substr(0, pos); num = str.substr(pos+1); q.push(op); q.push(num); } else { q.push(str); } } node head = new Node(); node prt = head; while (!q.empty()) { if (q.front() == "Push") { q.pop(); int value = stoi(q.front()); s.push(value); q.pop(); node temp = new Node(); if (prt->leftSon) { leftOrRight.push("right"); prt->rightSon = temp; temp->father = prt; } else { leftOrRight.push("left"); prt->leftSon = temp; temp->father = prt; } prt = temp; } else { q.pop(); if (leftOrRight.top() == "left") prt = prt->father; prt->value = s.top(); if (leftOrRight.top() == "right") prt = prt->father; s.pop(); leftOrRight.pop(); } } postOrder(prt); return 0;}

 

以上是我写的代码,因为没有注意到题目中暗含着两种遍历,所以写的代码也很乱,当然也是错误的。


以下的代码来自: 

#include 
#include
#include
#include
#include
#include
using namespace std; int N,cur;vector
preOrder;vector
inOrder; typedef struct TreeNode *Node;struct TreeNode{ int num; Node left,right; TreeNode(){ left = NULL; right = NULL; } }; int findRootIndex(int rootNum){ for(int i = 0;i < N; i++){ if(inOrder[i] == rootNum){ return i; } } return -1; } Node CreateTree(int left, int right){ if(left > right) return NULL; int root = preOrder[cur]; cur++; int rootIndex = findRootIndex(root); Node T = new TreeNode(); T->num = root; if(left != right){ T->left = CreateTree(left,rootIndex-1); T->right = CreateTree(rootIndex+1,right); } return T;} bool firstOutPut = true;void PostOrder(Node T){ if(!T) return; PostOrder(T->left); PostOrder(T->right); if(firstOutPut){ printf("%d",T->num); firstOutPut = false; }else{ printf(" %d",T->num); }} int main(){ stringstream ss; string Nstr; getline(cin,Nstr); ss << Nstr; ss >> N; ss.clear(); string input; stack
stk; int value; for(int i = 0; i < N * 2; i++){ getline(cin,input); if(input[1] == 'u'){ string num = input.substr(5); ss << num; ss >> value; ss.clear(); stk.push(value); preOrder.push_back(value); }else{ value = stk.top(); stk.pop(); inOrder.push_back(value); } } Node T = CreateTree(0,N-1); PostOrder(T); return 0;}

  

值得注意的是cur并没有赋初值,测试发现他的初值默认为0.

 

转载地址:http://ectuz.baihongyu.com/

你可能感兴趣的文章
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
nginx配置全解
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置后台网关映射路径
查看>>
nginx配置域名和ip同时访问、开放多端口
查看>>
Nginx配置多个不同端口服务共用80端口
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-动静分离实例:搭建静态资源服务器
查看>>
Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中
查看>>
Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置自带的stub状态实现活动监控指标
查看>>
nginx配置详解、端口重定向和504
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
Nginx配置限流,技能拉满!
查看>>
Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
查看>>
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
查看>>
Nginx:NginxConfig可视化配置工具安装
查看>>