关键词:数据结构,二叉树,层序遍历,中序遍历
试题链接:
Tree Traversals
问题描述:
思路:
postorder:后序遍历,inorder:中序遍历。这道题的意思就是根据给出的后序遍历和中序遍历重建出二叉树,然后输出二叉树的层序遍历。
备注:
做题的时候遇见了内存超过限制的错误。
放进本地跑了一遍,遇见了异常:
然后发现是重建右子树的递归部分代码忘了写-1。(根节点应该是已经被访问过了的,访问过了以后就要跳过否则会混乱)
解决方案:
#include<iostream>
#include<queue>
using namespace std;
int postorder[50], inorder[50];
struct node {
int data; //数据域
node* lchild; //左孩子
node* rchild; //右孩子
};
//根据后序遍历和中序遍历重建二叉树
node* create(int postL, int postR, int inL, int inR) {
//后序队列长度小于等于0时直接返回
if (postL > postR)return NULL;
node* root = new node;
root->data = postorder[postR]; //新结点数据域等于后序遍历最后的值
int k;//在中序遍历中找到根节点的位置
for (k = inL; k < inR; k++) {
if (inorder[k] == postorder[postR]) {
break;
}
}
int numLeft = k - inL; //左子树结点个数
//重建其左子树
root->lchild = create(postL, postL + numLeft - 1, inL, k - 1);
//重建其右子树
root->rchild = create(postL + numLeft, postR-1, k+1, inR);
//递归重建完毕后返回根节点的坐标
return root;
}
//层序遍历二叉树
void LayerOrder(node* r) {
queue<node*>q;
q.push(r);
while (!q.empty()) {
node* now = q.front();
q.pop();
cout << now->data << " ";
if (now->lchild != NULL) {
q.push(now->lchild);
}
if (now->rchild != NULL) {
q.push(now->rchild);
}
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> postorder[i];
}
for (int i = 0; i < n; i++) {
cin >> inorder[i];
}
node* tree = create(0, n - 1, 0, n - 1);
LayerOrder(tree);
}