如何创建二叉搜索树?

时间:2014-02-23 08:45:15

标签: algorithm binary-tree binary-search-tree

假设我有一个数组说

1 5 4 6 8 9 10 22 17 7 9 3

我想从这个数组创建一个二叉搜索树。我需要算法来理解它。

我已阅读其他与BST相关的内容,如inorder traversal preorder postordertree walkinsertion deletion

Book未提供如何创建BST。需要帮助

3 个答案:

答案 0 :(得分:1)

如果你不关心树的平衡,那很简单:

  1. 将树的第一个元素作为头部。
  2. 遍历数组。如果一个元素大于节点左转(重复左子步骤),否则右转(重复右子步骤)。
  3. 如果左/右子项为空,则在那里插入新值。
  4. 保证生成二叉搜索树 - 只是不平衡的搜索树。

答案 1 :(得分:0)

首先,您应该为BST选择一个根节点。一旦选择了根节点,考虑到以下事实就很容易构建BST:左子节点小于父节点,所有右子节点都大于父节点。 < / p>

private Node root;

public void insert(int val) {
    if (root == null) {
        root = new Node(val);
    } else {
        insertHelper(root, val);
    }
}

private void insertHelper(Node node, int val) {
    if (val < node.val) {
        if (node.left == null) {
            node.left = new Node(val);
        } else {
            insertHelper(node.left, val);
        }
    } else if (node.val < val) {
        if (node.right == null) {
            node.right = new Node(val);
        } else {
            insertHelper(node.right, val);
        }
    }
}

答案 2 :(得分:0)

如果给定的数组已排序,您可以执行以下操作:

  1. 获取数组的中间元素并使其成为树的根
  2. 取左子数组,并以递归方式将其作为根的左子树
  3. 选择正确的子数组并使其成为递归的正确子树
  4. 否则,您始终可以在应用此过程之前对数组进行排序

    struct node* construct(int arr[], int start, int end)
    {
        if(start>end)
           return;
        else if (start==end)
        {
        /*assuming we have a function newNode(int) which creates a new BST Node*/
            node* Node = newNode(arr[start]);
            return Node;
        }
        int mid  = (start+end)/2;
        node* root = newNode(arr[mid]);
        root->left = construct(arr,start,mid-1);
        root->right = construct(arr,mid+1,end);
        return root;
    }
    

    struct node* construct(int arr[], int start, int end) { if(start>end) return; else if (start==end) { /*assuming we have a function newNode(int) which creates a new BST Node*/ node* Node = newNode(arr[start]); return Node; } int mid = (start+end)/2; node* root = newNode(arr[mid]); root->left = construct(arr,start,mid-1); root->right = construct(arr,mid+1,end); return root; }