【问题标题】:How binary search tree is created?二叉搜索树是如何创建的?
【发布时间】:2014-02-23 08:45:14
【问题描述】:

假设我有一个数组说

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

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

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

本书没有提供如何创建 BST。在这里需要帮助

【问题讨论】:

  • 我认为你是在学习树的开始,暂时不要关心平衡。
  • @GökhanÇoban:对。刚开始学树。书上有些东西不是很清楚。所以在这里发帖
  • 我会按这个顺序去。 1.二叉树(不平衡) 2.AVL树 3.红黑树 4.Splay树

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


【解决方案1】:

如果您不关心树是否平衡,这很简单:

  1. 将树的第一个元素作为头部。
  2. 遍历数组。如果元素大于节点,则向左(对左孩子重复该步骤),否则向右(对右孩子重复该步骤)。
  3. 如果左/右孩子为空,则在此处插入您的新值。

保证生成二叉搜索树 - 只是不是平衡的。

【讨论】:

  • 感谢答案,但如何平衡树?
  • 看这里:en.wikipedia.org/wiki/Red%E2%80%93black_tree - 带有伪代码的维基链接。祝你好运
  • 但是假设第一个元素是1 那么它不会创建任何树
  • 是的,它会.. 1 是根,比 5 成为它的右孩子,比 4 成为 5 的左孩子等等。
  • 您提供的链接是针对红黑树的。你能给我一个链接,它会显示创建平衡二叉树,如何选择根节点
【解决方案2】:

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

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);
        }
    }
}

【讨论】:

  • 如何选择根节点。
  • 这取决于你。您可以根据情况选择所需的任何根节点。当然,树的结构取决于你选择的根节点。
【解决方案3】:

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

  1. 取数组的中间元素,使其成为树的根
  2. 取左子数组,递归使其成为根的左子树
  3. 取右子数组,递归使其成为根的右子树

否则,您始终可以在应用程序之前对数组进行排序

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多