找到二进制搜索树的最佳根

时间:2017-10-31 15:35:09

标签: c++ arrays binary-search-tree

我正在尝试为我的二叉搜索树找到最好的根。即这是我的二叉搜索树。

         42
       /    \
      /      \
     25      53
    /  \    /  \
  23    41 49   55
 /  \  / \ / \ /  \

然后我以inOrder walk的形式将它们保存在一个数组中。

| 23 | 25 | 41 | 42 | 49 | 53 | 55 | .........
...........↑↑........... ...........↑...........

所以指向箭头的那些节点是我试图看哪一个是最好的根41,42,53。(数组可以更大,我将采用奇数指数具有给定树深度的数组。)

所以我必须尝试每一个奇数索引作为我的新根,并将每个高度与前一个高度进行比较,并且我可以确定哪个是我的最佳高度。即如果我决定25是我的新根,我就可以拥有这样的树

          25                            25
            \                             \
             \                             \
             42          or                 53
               \                            /
                53                         42
                  \                       /

所以对于每一个我检查并比较高度与数组中的前一个节点,我返回节点,它将给我最好的节点。 到目前为止我试过这个:

void rebalance(){

    //this is the size for the array and NumDepth is defined at the constructor

    int size = (pow (2,(numDepth +1) )-1);
    Node* Array2 [size];
    int i = 0;
    int bestH = 0;
    Node* temp;

    for (int i=0; i < size; i++){
            Array2[i]= new Node();
            Array2[i]= NULL;
    }
    //this function will be the one creates the inOrder walk and saves my nodes inside the array
    storeInOrder(rootBST, Array2, i, numDepth);

    temp = shortestBST(Array, rootBST, bestH, height);


}

Node* shortestBST(Node *root[], Node* root, int &bestHeigth, int sizeA) {
//root is my main tree basically 

//this is how i know that i have to use the odd numbers in the array

    for(int i= 1; i< sizeA; i+=2){

       //inside here I am supposed to do a recursion to check every node inside the array to check the node that is the best
      //they gave me a hint saying that i can point the nodes in the array to the ones in my main tree to create the tree with the new testing root in order to check if that node can create a best tree but i don't know how to do that using recursion
//each of my nodes hold a key, a height and a size of a subtree , left to point to the left and a right to point to the right

    }




}

Node::Node() {

    sizeSub=0;
    height=1;
    key=0;
    left=NULL;
    right=NULL;
}

2 个答案:

答案 0 :(得分:1)

由于你是按照排序顺序从数字开始,找到根节点非常简单:理想的根是要插入的数字的中位数。

这使得以递归方式进行插入非常简单:找到中位数,将其作为根插入,然后将左子数组作为左子项插入,将右子数组作为右子项插入。

答案 1 :(得分:0)

这是一个类似的问题和算法,看起来就像这里要求的那样:

  1. 使用右旋转操作,将树转换为链接列表    (a.k.a. backbone or vine)
  2. 围绕其父级转动主干的每个第二个节点   骨干成为完美平衡的BST。
  3. http://www.geekviewpoint.com/java/bst/dsw_algorithm