当前位置: 首页 > 知识库问答 >
问题:

如何创建不平衡的二叉搜索树

仲高超
2023-03-14
// Tree Node 
static class Node { 
    int data; 
    Node left, right; 
    Node(int data) 
    { 
        this.data = data; 
        this.left = null; 
        this.right = null; 
    } 
    @Override public String toString() { 
     return String.valueOf(data); 
     }
} 

// Function to insert nodes in level order 
public Node insertLevelOrder(int[] arr, Node root, 
                                            int i) 
{ 
    // Base case for recursion 
    if (i < arr.length) { 
        Node temp = new Node(arr[i]); 
        root = temp; 

        // insert left child 
        root.left = insertLevelOrder(arr, root.left, 
                                         i + 1); 

        // insert right child 
        //root.right = insertLevelOrder(arr, root.right, 
                                          // 2 * i + 2); 

        //System.out.println(root);  
    } 
    return root; 
} 

// Function to print tree nodes in InOrder fashion 
public void inOrder(Node root) 
{ 
    if (root != null) { 
        inOrder(root.left); 
        System.out.print(root.left + " "); 
        //inOrder(root.right); 
    } 
} 

// Driver program to test above function 
public static void main(String args[]) 
{ 
    Tree t2 = new Tree(); 
    int arr[] = {9,5,0,-3,-10}; 
    t2.root = t2.insertLevelOrder(arr, t2.root, 0); 
    t2.inOrder(t2.root); 
} 
} 

我不知道这些节点是否被插入,但输出结果是正确的。我只想插入节点到左边的孩子,我可以消除那代码吗?root.right=insertLevelOrder(arr,root.right,2*i+2);

还有为什么这个循环没有“i++”的符号,int i是如何自动增加的?

共有1个答案

林元明
2023-03-14

有很多缺失的东西。我不会为你解决一切(那不是SO的目的),而是会给你暗示。

首先,你需要有一些东西来建立一个树(设置一个节点的左右节点):

public class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;
     TreeNode(int x) {
         val=x;
     }
     TreeNode(int v,TreeNode l,TreeNode r) {
         this(x);
         left = l;
         right = l;
     }   
     @Override public String toString() {
         return "(" + (left==null?"*":left) + "," + val + "," + (right==null?"*":right) + ")";
     }
}

因此,您可以创建(并打印)如下所示的树(例如):

TreeNode n1 = new TreeNode(1);
TreeNode n3 = new TreeNode(3);
TreeNode n2 = new TreeNode(2,n1,n3);
TreeNode n4 = new TreeNode(4,n3,null);
System.out.println(n4);
    null
 类似资料:
  • 在上一节中,我们考虑构建一个二叉搜索树。正如我们所学到的,二叉搜索树的性能可以降级到 $$O(n)$$ 的操作,如 get 和 put ,如果树变得不平衡。在本节中,我们将讨论一种特殊类型的二叉搜索树,它自动确保树始终保持平衡。这棵树被称为 AVL树,以其发明人命名:G.M. Adelson-Velskii 和E.M.Landis。 AVL树实现 Map 抽象数据类型就像一个常规的二叉搜索树,唯一

  • 在我们继续之前,我们来看看执行这个新的平衡因子要求的结果。我们的主张是,通过确保树总是具有 -1,0或1 的平衡因子,我们可以获得更好的操作性能的关键操作。 让我们开始思考这种平衡条件如何改变最坏情况的树。有两种可能性,一个左重树和一个右重树。 如果我们考虑高度0,1,2和3的树,Figure 2 展示了在新规则下可能的最不平衡的左重树。 Figure 2 看树中节点的总数,我们看到对于高度为0的

  • 所以,我一直在研究平衡的二叉查找树。 我谷歌了一下,这是我的发现: 二叉树,其中每个节点的两个子树的深度相差 1 或更小(来自维基百科) 难道就不能把平衡二叉树定义为高度不超过ceil(log(n ^ 1)/log ^ 2)的树吗? 从这个答案来看,提问者似乎已经问了同样的事情,但是公认的答案通过举斐波纳契树的例子拒绝了这个想法。斐波纳契树不是平衡树,对吗?我认为回答者可能会与AVL树中平衡树的定

  • 我目前正在编写一个递归方法,以返回整个二元搜索树上的最大不平衡。我对递归编程非常陌生,所以很难理解。我构建的树的不平衡度为1,但我的方法只返回0。我相信我的逻辑是有缺陷的。 我百分之百确定它正在运行“(root==null){返回0;}”在方法的每个步骤中。我尝试删除它并进一步定义它,它仍在继续这样做。 这是我当前的方法:

  • 好的,所以我目前正在尝试创建一个二叉搜索树,每个节点都包含对某个对象的引用,以及对其左侧子项的引用和对右子项的引用(总共3个变量)。左子项必须始终小于其父项,而右子项必须始终大于其父项。我必须创建两个方法:1种方法( contains()) 来检查元素是否在树中,以及一个add()方法将元素添加到树中的适当位置。 以下是BinarySearchTree类: 下面是TreeNode类(包含在Bina

  • 如果二叉树是平衡的,那么二叉搜索的最佳运行时间是O(log(n))。最坏的情况是,如果二叉树非常不平衡,它基本上表示一个链表。在这种情况下,二进制搜索的运行时间将为O(n)。 但是,如果树只是稍微不平衡,就像这棵树的情况一样: 如果我没记错的话,最好的情况仍然是O(log n)。但是最坏的情况是什么?