1. 程式人生 > >【數據結構】5.2 二叉搜索樹的創建查找以及插入操作

【數據結構】5.2 二叉搜索樹的創建查找以及插入操作

函數 use span system 指針 二叉搜索樹 new bug 個數

TAG 此代碼遇到一個bug,在Insert函數中,註釋部分,思考一下為什麽用這個方法來添加會失效

#include<iostream>
using namespace std;
struct BTNode {
    int data;
    BTNode *lchild,*rchild;
};
void selectsort(int a[], int n)
{
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            if
(a[i] > a[j]) { int temp = a[j]; a[j] = a[i]; a[i] = temp; } } } } class BTree { private: BTNode *root; void creat(int loc, BTNode *p); void travel(BTNode *p); int *data, number; void search(int
key, BTNode *p, bool &flag); void insert(BTNode *p, int x); public: BTree(int a[], int n); void Creat(); void Insert(int x); void Search(int key); void print(); }; BTree::BTree(int a[], int n) { int mid = a[n / 2]; root = new BTNode(); root->data = mid; root
->lchild = root->rchild = NULL; number = n; data = new int[number]; for (int i = 0; i < number; i++) { data[i] = a[i]; } selectsort(data, number); } void BTree::Insert(int x) { BTNode *p = root; insert(p, x); cout << "插入完成!" << endl; } void BTree::insert(BTNode *p, int x) { /*if (p==NULL) { p = new BTNode(); p->data = x; p->rchild = p->lchild = NULL; cout << "p->data" <<p->data<< endl; } else if (x > p->data) { insert(p->rchild, x); } else if (x < p->data) { insert(p->lchild, x); }*/ if (x > p->data) { if (p->rchild == NULL) { p->rchild = new BTNode(); p->rchild->data = x; p->rchild->rchild = p->rchild->lchild = NULL; cout << "p->data" << p->rchild->data << endl; } else insert(p->rchild, x); } else if (x < p->data) { if (p->lchild == NULL) { p->lchild = new BTNode(); p->lchild->data = x; p->lchild->rchild = p->lchild->lchild = NULL; cout << "p->data" << p->lchild->data << endl; } else insert(p->lchild, x); } } void BTree::print() { BTNode *p = root; travel(p); cout << endl; } void BTree::search(int key, BTNode *p,bool &flag) { while (p) { if (p->data == key) { flag = true; break; } else if (p->data>key) { p = p->lchild; } else { p = p->rchild; } } } void BTree::creat(int loc, BTNode * p) { if (data[loc] > p->data) { if (p->rchild == NULL) { p->rchild = new BTNode(); p->rchild->data = data[loc]; p->rchild->lchild = p->rchild->rchild = NULL; } else { creat(loc, p->rchild); } } else if (data[loc] < p->data) { if(p->lchild == NULL) { p->lchild = new BTNode(); p->lchild->data = data[loc]; p->lchild->lchild = p->lchild->rchild = NULL; } else { creat(loc, p->lchild); } } } void BTree::travel(BTNode * p) { if (p != NULL) { travel(p->lchild); cout << p->data << " "; travel(p->rchild); } } void BTree::Creat() { BTNode *p = root; for (int i = 0; i < number; i++) { creat(i, p); } cout << "二叉搜索樹創建成功了。。。吧" << endl; } void BTree::Search(int key) { BTNode *p = root; bool flag = false; search(key, p, flag); if (flag) { cout << "搜索到" << key << "在二叉樹中" << endl; } else { cout << "未查找到指定數據!" << endl; } } int main() { cout << "請輸入二叉搜索樹的元素個數:"; int number, *a, key, x; cin >> number; a = new int[number]; cout << "請分別為這些元素賦值:" << endl; for (int i = 0; i < number; i++) { cin >> a[i]; } BTree test(a, number); test.Creat(); test.print(); cout << "請輸入要查找的數值" << endl; cin >> key; test.Search(key); cout << "請輸入要插入的數值" << endl; cin >> x; test.Insert(x); test.print(); system("pause"); return 0; }

主要還是因為指針的問題。

在註釋中,是判斷p是否為空來創建,但是註意這個NULL是隨機的,雖然p空這個值是葉子節點的孩子賦值的,但是再用p來開辟空間就已經完全和二叉樹沒有關系了,所以在打印的時候找不到

而在@陳總 的解決辦法中,是直接通過先判斷大小再判斷它下面的左右指針是否為空來進行插入(因為你是知道左小右大的,所以只用判斷一個),然後再用p->lchild或者p->rchild來開辟空間就避免出現這種問題。

當然註釋的那種解決方案也是有的,你需要記錄一下葉子結點的地址,然後把p連接上去···額

【數據結構】5.2 二叉搜索樹的創建查找以及插入操作