PAT-A1127. 二叉树-中序后序建树,Z字遍历
2017-03-20 21:29
375 查看
题目链接:https://www.patest.cn/contests/pat-a-practise/1127
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However, if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in “zigzagging order” – that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left. For example, for the following tree you must output: 1 11 5 8 17 12 20 15.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<= 30), the total number of nodes in the binary tree. The second line gives the inorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the zigzagging sequence of the tree in a line. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
Sample Output:
中序后序建树,或前序中序建树,主要是理清思路,前序的第一个结点或后序的最后一个结点是根结点,根据根结点分割中序,左右子数组分别就是左右子树,然后再将子数组对应前序或后序数组中寻找该子树的根结点,循环如此。
Z字形遍历的关键点在于层序遍历并分层输出,分层的方法在上一篇博客中已经讲了,就是标记每层最左边的结点,在输出过程中根据层数选择正序或倒序输出即可。
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However, if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in “zigzagging order” – that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left. For example, for the following tree you must output: 1 11 5 8 17 12 20 15.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<= 30), the total number of nodes in the binary tree. The second line gives the inorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the zigzagging sequence of the tree in a line. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
8 12 11 20 17 1 15 8 5 12 20 17 11 15 8 5 1
Sample Output:
1 11 5 8 17 12 20 15
中序后序建树,或前序中序建树,主要是理清思路,前序的第一个结点或后序的最后一个结点是根结点,根据根结点分割中序,左右子数组分别就是左右子树,然后再将子数组对应前序或后序数组中寻找该子树的根结点,循环如此。
Z字形遍历的关键点在于层序遍历并分层输出,分层的方法在上一篇博客中已经讲了,就是标记每层最左边的结点,在输出过程中根据层数选择正序或倒序输出即可。
#include <iostream> #include <queue> #include <vector> #include <algorithm> using namespace std; struct BTree { int data; BTree* lchild; BTree* rchild; }; BTree* T; int indata[35]; int posdata[35]; BTree* Construct(int* posBegin, int* inBegin, int len){ BTree* root = new BTree(); root->data = posBegin[len-1]; root->lchild = NULL; root->rchild = NULL; int* rootInorder = inBegin; while (rootInorder <= inBegin+len && *rootInorder != root->data) { ++rootInorder; } int leftLen = (int)(rootInorder - inBegin); int rightLen = len - leftLen - 1; int* rightPosBegin = posBegin + leftLen; if(leftLen > 0){ root->lchild = Construct(posBegin, inBegin, leftLen); } if(rightLen > 0){ root->rchild = Construct(rightPosBegin, rootInorder+1, rightLen); } return root; } void LevelOrder(BTree* root){ queue<BTree*> qt; vector<int> printOut; qt.push(root); int cnt = 0; BTree* left = NULL; bool findLeft = false; while (!qt.empty()) { BTree* tr = qt.front(); qt.pop(); if(tr == left) { if(!(cnt & 1)) reverse(printOut.begin(), printOut.end()); for(int i = 0; i < printOut.size(); ++i){ cout << printOut[i] << " "; } findLeft = false; left = NULL; printOut.clear(); cnt++; } printOut.push_back(tr->data); if(tr->lchild){ qt.push(tr->lchild); if(!findLeft){ findLeft = true; left = tr->lchild; } } if(tr->rchild){ qt.push(tr->rchild); if(!findLeft){ findLeft = true; left = tr->rchild; } } } if(!(cnt & 1)) reverse(printOut.begin(), printOut.end()); for(int i = 0; i < printOut.size(); ++i){ cout << printOut[i]; if(i<printOut.size()-1) cout << " "; else cout << endl; } } int main() { int n; cin >> n; for(int i = 0; i < n; ++i) cin >> indata[i]; for(int i = 0; i < n; ++i) cin >> posdata[i]; T = Construct(posdata, indata, n); LevelOrder(T); return 0; }
相关文章推荐
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
- pat 甲1127. ZigZagging on a Tree (已知后序及中序建树,并层次往返输出)
- PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树
- 二叉树的建树,按层遍历,结点总数,页结点,深度以及三序非递归遍历二叉树,建立中序线索二叉树
- PAT-A1099. 二叉树-中序建树 层序输出
- 7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)
- PAT 1020(由二叉树的中序和后序,求层序遍历) 1086(由二叉树的中序和先序求后序遍历)
- 动态二叉树后序和中序建树并层序遍历
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 剑指offer-重建二叉树 由前序和中序遍历序列建树
- 已知二叉树前序、后序遍历如何求中序
- 二叉树由先序和中序建树
- [置顶] 数据结构之 二叉树的构造与遍历(先序,中序,后序,层次)
- wiki 3143 二叉树的前序、中序及后序遍历
- Java二叉树(三)--非递归的中序_先序_后序遍历二叉树
- JAVA二叉树,给出先序遍历和中序遍历,构造出新的二叉树
- 二叉树:根据二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- LeetCode 106. 已知中序和后序遍历构建二叉树
- 二叉树三种遍历方式,先序、中序、后序
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列