已知先序和中序构建二叉树并且以层序输出
2017-04-23 10:50
489 查看
题目描述
深度遍历一棵二叉树有先序,中序和后序三种方式,并且根据遍历序列能确定一棵二叉树,要唯一确定一棵二叉树至少需要两种遍历序列 先序+中序 或 后序+中序,(先序+后序无法唯一确定) 现在给定你一棵二叉树的先序和中序序列,请你构造出这棵二叉树,并且输出其层序遍历结果输入
输入包含多组测试数据对每组测试数据:
第一行为一个正整数n(0<n<=100)代表二叉树节点个数
第二行为这棵树的先序遍历序列
第三行为其中序遍历序列
(每个节点为整型数字)
当读到文件结尾时输入结束.
输出
对每组测试数据在一行中输出这棵树的层序遍历结果 中间用空格隔开,最后一个数字后面不得有空格。
样例输入
8 7 10 4 3 1 2 8 11 4 10 3 1 7 11 8 2
样例输出
7 10 2 4 3 8 1 11
:
#include <iostream> #include <queue> using namespace std; typedef struct Node { int data; struct Node* LChild; struct Node* RChild; }Node; //种树 Node* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder) { int rootValue = startPreorder[0]; Node* root = new Node; root->data = rootValue; root->LChild = root->RChild = NULL; if (startPreorder == endPreorder) { if (startInorder == endInorder && *startPreorder == *endInorder) return root; } int* rootInorder = startInorder; while (rootInorder <= endInorder && *rootInorder != rootValue) rootInorder++; int leftLength = rootInorder - startInorder; int* leftPreorderEnd = startPreorder + leftLength; if (leftLength > 0) { root->LChild = ConstructCore(startPreorder + 1, leftPreorderEnd, startInorder, rootInorder - 1); }//左子树 if(leftLength < endPreorder - startPreorder) { root->RChild = ConstructCore(leftPreorderEnd + 1, endPreorder, rootInorder + 1, endInorder); }//右子树 return root; } Node* Construct(int* preorder, int* inorder, int length) { if (preorder == NULL || inorder == NULL || length <= 0) return NULL; return ConstructCore(preorder, preorder + length - 1, inorder, inorder + length - 1); } //倒序输出 void TraverseTreePostorder(Node* proot) { if(proot == NULL) return; if(proot->LChild != NULL) TraverseTreePostorder(proot->LChild); if(proot->RChild != NULL) TraverseTreePostorder(proot->RChild); cout << proot->data << " "; } //层序输出 void Print(Node* T) { int parentSize = 1, childSize = 0; queue <Node*> q; Node* temp; q.push(T); temp = q.front(); cout << temp->data << " "; while (!q.empty()) { q.pop(); if (temp->LChild != NULL) { q.push(temp->LChild); childSize++; } if (temp->RChild != NULL) { q.push(temp->RChild); childSize++; } parentSize--; if (parentSize == 0) { parentSize = childSize; childSize = 0; } if (!q.empty()) { temp = q.front(); cout << temp->data << " "; //控制输出格式 } } } int main() { int n, i; while (scanf("%d", &n) != EOF) { int preorder[100]; int inorder[100]; for (i = 0; i < n; i++) cin >> preorder[i]; for (i = 0; i < n; i++) cin >> inorder[i]; Node* pRoot = Construct(preorder, inorder, n); // TraverseTreePostorder(pRoot); // cout << endl; //倒序输出 Print(pRoot); } return 0; }
相关文章推荐
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 已知二叉树的前序和中序遍历,构建该二叉树
- 已知一颗二叉树S的前序遍历和中序遍历 序列,请编程输出二叉树S的后续遍历序列.
- 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
- 二叉树--已知前序遍历和中序遍历,输出后续遍历
- 已知二叉树的先序排列和中序排列,重构该二叉树,并输出该树的后序遍历
- 二叉树--已知前序遍历和中序遍历,输出后续遍历
- 已知二叉树先序、中序(中序、后序)遍历序列,输出后序(先序)遍历序列
- PAT-A1099. 二叉树-中序建树 层序输出
- 二叉树已知中序后序输出前序
- Java实现二叉树的递归构建及先序、中序、后序、层序遍历(递归和循环)
- 已知一颗二叉树S的前序遍历和中序遍历序列,请编程输出二叉树S的后续遍历序列。
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- PAT-A1102. 二叉树-翻转 层序、中序输出
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 天梯赛L2-006树的遍历---已知中序后序---输出层序遍历
- 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 二叉树——已知二叉树先序,建树,并输出中序、后序,并求树叶数和深度