给定二叉搜索树的前序遍历,构建树结构,在做 PTA 的时候遇到了这个问题,以下是思路:
给定前序遍历: 6 3 1 2 5 4 8 7,画图树形图:
可以看到 前序遍历给出的左半部分是左子树,右半部分是右子树,此时,我们找到第一个大于根节点 6 的节点就是 8,那么 8 左边都是左子树,右边包括 8 都是右子树,就可以建立树了
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef struct Node {
int val;
struct Node *left, *right;
}Node, *Tree;
int n;
Tree create(int left, int right, int *a) {
if (left > right) {
return NULL;
}
Tree tree = (Tree)malloc(sizeof(Node));
tree->val = a[left];
int i = left;
for (i = left + 1; i <= right; i++) {
if (a[i] > a[left]) {
break;
}
}
tree->left = create(left + 1, i - 1, a);// 左边界 根节点加一, 右边界 i - 1
tree->right = create(i, right, a);// 左边界 i,右边界 right
return tree;
}
void preorder(Tree tree) {
if (tree) {
cout << tree->val << " ";
preorder(tree->left);
preorder(tree->right);
}
}
int main() {
cin >> n;
int a[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
Tree tree = create(0, n - 1, a);
preorder(tree);
return 0;
}