使用双指针建立二叉排序树,注意以前输入的数据不用再插入到书中,本题依然需要用while循环输入,每次建树前记得把root置为空否则下次再次建树root不为空导致根结点没法初始化

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>

// 应对重复元素,建立一个哈希表,若输入的元素出现过,忽略本次插入操作
int hash[1001];

struct TreeNode {
    int data;
    TreeNode* left;
    TreeNode* right;
};

void preorder(TreeNode* root) {
    if (root == NULL) {
        return;
    }
    printf("%d ", root->data);
    preorder(root->left);
    preorder(root->right);
}

void inorder(TreeNode* root) {
    if (root == NULL) {
        return;
    }
    inorder(root->left);
    printf("%d ", root->data);
    inorder(root->right);
}

void postorder(TreeNode* root) {
    if (root == NULL) {
        return;
    }
    postorder(root->left);
    postorder(root->right);
    printf("%d ", root->data);
}

int main() {
    int n, x;
    TreeNode* root;
    TreeNode* pre;
    TreeNode* cur;
    while (scanf("%d", &n) != EOF) {
        for (int i = 0; i < 1001; i++) {
            hash[i] = 0;
        }
        root = NULL;
        for (int i = 0; i < n; i++) {
            scanf("%d", &x);
            if (hash[x] == 1) continue;
            hash[x] = 1;
            TreeNode* newnode = new TreeNode;
            newnode->data = x;
            newnode->left = NULL;
            newnode->right = NULL;
            if (root == NULL) {
                root = newnode;
            }
            else {
                pre = root; // 从根开始比较
                cur = root;
                // 二叉排序树一定是在空叶子插入
                while (cur != NULL) {
                    if (x < pre->data) {
                        cur = pre->left;
                        if (cur == NULL) {
                            pre->left = newnode;
                            break;
                        }
                        pre = cur; // 继续找下一个符合条件的位置
                    }
                    if (x > pre->data) {
                        cur = pre->right;
                        if (cur == NULL) {
                            pre->right = newnode;
                            break;
                        }
                        pre = cur; // 继续找下一个符合条件的位置
                    }
                }
            }
        }
        // 输出前中后序遍历
        preorder(root);
        printf("\n");
        inorder(root);
        printf("\n");
        postorder(root);
        printf("\n");
    }
    return 0;
}