Case1:满二叉树
题目描述
给出一棵满二叉树的先序遍历,有两种节点:字母节点(A-Z,无重复)和空节点(#)。要求这个树的中序遍历。输出中序遍历时不需要输出#。满二叉树的层数n满足1<=n<=5。
Sample Input:
ABC#D#E
Sample Output:
CBADE
Solution:
满二叉树的特征很明显,左右子树结点个数相等,那么以某一个结点为根的子树中,该根节点在先序遍历中排在第一位,其在中序遍历中一定排在最中间的位置上。利用分治的思想,建立一个数组,
- 根节点插入到数组中间位置,
- 一直这样直至数组左边中间位置已满开始插入到右边数组的中间位置,
- 依次递归 . . . . . .
以示例为例,遍历前序遍历字符串插入到数组中,最后输出数组中字符串,即为中序遍历字符串。 M
代码如下:
#include <iostream>
#include <string.h>
using namespace std;
int i; // 全局变量,控制字符串的遍历
string s;
void insert(char a[], int left, int right){
// 将字符串各个元素插入数组对应位置
int mid = (left + right) / 2;
if(left <= right && a[mid] != s[i]){
a[mid] = s[i++];
insert(a, left, mid-1);
insert(a, mid+1, right);
}
}