1. 程式人生 > 實用技巧 >The order of a Tree HDU - 3999 (二叉搜尋樹)

The order of a Tree HDU - 3999 (二叉搜尋樹)

題意:題意給出一個序列,構造一棵二叉搜尋樹,讓你找一個序列,滿足:能構成與給出的序列相同的二叉搜尋樹,同時,字典序最小。

思路:首先構造二叉搜尋樹,然後先序遍歷輸出即可。


#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<queue>
#include<set>        
#include <sstream>
#include
<vector> #include<cmath> #include<stack> #include<time.h> #include<ctime> using namespace std; #define inf 1<<30 #define eps 1e-7 #define LD long double #define LL long long #define maxn 1000005 #define ll unsigned long long int n; int a[maxn] = {}; struct node {
int num; node* Lchild=NULL; node* Rchild=NULL; }; node* add(node* tree, int k) { if (tree == NULL) { tree = new node(); tree->num = k; tree->Lchild = NULL; tree->Rchild = NULL; } else if (k < tree->num) { tree->Lchild = add(tree->Lchild, k); }
else { tree->Rchild = add(tree->Rchild, k); } return tree; } void PreOrder(node* tree, int flag) { if (flag == 1) printf("%d", tree->num); else printf(" %d", tree->num); if (tree->Lchild != NULL) PreOrder(tree->Lchild, 0); if (tree->Rchild != NULL) PreOrder(tree->Rchild, 0); } int main() { while (~scanf("%d", &n)) { node* Tree=NULL; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); Tree=add(Tree, a[i]); } PreOrder(Tree, 1); printf("\n"); } }