九度 1467:二叉排序树

题目描述:

        二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:


        1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
        2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
        3. 左、右子树本身也是一颗二叉排序树。


  现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。

思路

1. 根据数组构建二叉搜索树

代码

#include <iostream>
#include <stdio.h>
using namespace std;

class Node {
public:
    Node(int _value):value(_value) {
        left = right = NULL;
    }

    Node() {
        Node(0);
    }

    int value;
    Node *left, *right;
};

int arr[200];
int n;

Node* findTree(Node* root, int x) {
    if(root->value > x) {
        if(root->left)
            return findTree(root->left, x);
        else {
            Node *newNode = new Node(x);
            root->left = newNode;
            return root;
        }
    }

    if(root->value < x) {
        if(root->right)
            return findTree(root->right, x);
        else {
            Node *newNode = new Node(x);
            root->right = newNode;
            return root;
        }
    }
}

void buildTree() {
    Node *root = new Node(arr[0]);
    cout << -1 << endl;
    for(int i = 1; i < n; i ++) {
        Node *father = findTree(root, arr[i]);
        cout << father->value << endl;
    }
}
int main() {
    while(scanf("%d", &n) != EOF) {
        for(int i = 0; i < n; i ++)
            scanf("%d", arr+i);

        buildTree();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xinsheng/p/3587100.html