我想寫遞歸遍歷一個數組去,將值插入到一棵樹,同時保持樹平衡功能初始化一個平衡二叉搜索樹。假設數組已經排序並且我們知道它的大小。我的理解是什麼,我需要做的是來自各地的數組的中間開始,將該值插入根,然後採取左,右兩半的中間,並將這些成左節點和根的權利,等等直到數組被填充。遞歸是首先想到的,我編碼的內容是有意義的,但似乎並沒有按照我的意圖工作。我有從Array C++
問題是未插入第一個和最後一個值,而我在每片葉子的左側和右側獲得垃圾值的節點,而不是他們的是NULL。
節點是簡單的(由教師提供)的結構:
/* A lightweight structure implementing a general binary tree node */
template <class T>
struct BTNode {
T elem; // element contained in the node
BTNode *left; // pointer to the left child (can be NULL)
BTNode *right; // pointer to the right child (can be NULL)
// Constructors
BTNode() { left = right = NULL; }
BTNode(T elem, BTNode* left = NULL, BTNode* right = NULL) {
this->elem = elem;
this->left = left;
this->right = right;
}
BTNode(const BTNode& src) {
this->elem = src.elem;
this->left = src.left;
this->right = src.right;
}
// Simple tests
bool is_leaf() const { return (left == NULL && right == NULL); }
};
這是我寫的函數:用於構造
// ---------------------------------------------------------------------------
// Constructor (from sorted array)
//
template<class T>
BinarySearchTree<T>::BinarySearchTree(T *elements, int n_elements) {
int high = n_elements-1;
int low = 0;
root = new BTNode<T>;
BSTreeHelper(low, high, elements, BinaryTree<T>::root);
}
助手功能:
template<class T>
void BinarySearchTree<T>::BSTreeHelper(int low, int high, T* elems, BTNode<T>* root) {
int mid = (low+high)/2; // to get the middle value
bool isEqual = (low+1 == high || high-1 == low);
// if there is a middle value, insert it
if (!isEqual) {
BTNode<T>* nodePtrL = new BTNode<T>;
root->left = nodePtrL;
BSTreeHelper(low, mid, elems, nodePtrL);
BTNode<T>* nodePtrR = new BTNode<T>;
root->right = nodePtrR;
BSTreeHelper(mid, high, elems, nodePtrR);
root->elem = elems[mid];
cout << "Inserted Element = " << root->elem << endl;
}
}
我似乎無法以任何方式對isEqual檢查做出不同的解釋,以便說明問題第一個和最後一個元素,我真的不知道爲什麼額外的節點正在創建垃圾值(最有可能的數組邊界之外的值)。感謝您的任何幫助,您可以提供。這是一項任務,所以我不想給出答案,但正確的方向點是非常感謝!