【数据结构】5.2 二叉搜索树的创建查找以及插入操作

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连接上去···额

原文地址:https://www.cnblogs.com/robotpaul/p/10152476.html

时间: 2024-10-10 17:31:57

【数据结构】5.2 二叉搜索树的创建查找以及插入操作的相关文章

二叉搜索树的创建 &amp;&amp; 查找 &amp; 插入 &amp; 删除

二叉搜索树的删除: 在删除之前需要从树中查找到这个节点,然后再针对情况来判断如何删除. 分为三种情况,首先是此节点没有孩子节点,此节点有一个孩子节点,此节点有两个孩子节点 void Delete(BinTree*& root,int value) { BinTree* delnode= NULL; if(root == NULL) return ; BinTree* temp = root; BinTree* parent =NULL; while(temp!=NULL) { if(temp-&g

二叉搜索树的创建

class Btreenode: #创建树 def __init__(self,data): self.data=data self.lchild=None self.rchild=None class BTS: def __init__(self,li): self.root=None for i in li: self.insert(i) def insert(self,key): #书中插入一个值 if not self.root: self.root=Btreenode(key) #没有

数据结构(6) -- 构建二叉搜索树

//BinTree.h #ifndef BINTREE_H_ #define BINTREE_H_ #define ElemType int typedef struct _PNode { ElemType data; _PNode *left; _PNode *right; }PNode; class BinTree { private: PNode *root; public: BinTree(); ~BinTree(); PNode* GetRoot(); //获得根节点 void Set

[数据结构]P2.1 二叉搜索树

二叉树就是每个节点最多有两个分叉的树.这里我们写一写一个典型的例子二叉搜索树,它存在的实际意义是什么呢? 在P1.1链表中,我们清楚了链表的优势是善于删除添加节点,但是其取值很慢:数组的优势是善于取值,但是不利于删除添加节点. 而二叉搜索树,正是两者的折中方案.首先,它是树状结构,因此它便于插入和删除节点,需要花费LogN级别的时间,其次,它 在每一个节点上都满足`左子树 <= 当前节点 <= 右子树`,因此便于使用二叉搜索,所以查找数据和取数据也是LogN级别的. 时间比较 链表 二叉搜索树

数据结构|-二叉查找树(二叉搜索树)的链式存储结构的实现

二叉排序树,又称为二叉查找树. 它或者是一棵空树,或者是具有下列性质的二叉树. 若它的左子树不为空,则左子树上所有的结点的值均小于根结构的值: 若它的右子树不为空,则右字数上所有结点的值均大于它的根结点的值: 它的左右子树也分别为二叉排序树. 优点: 1,排序方便 2,方便查找 3,方便插入和删除 二叉排序树的插入数据: 因为二叉排序树中所有的数都符合排序树的特点,所以任意插入一个数时,都能在遍历树的过程中找到其应该放置的正确位置 二叉排序树的删除数据: 三种情况: 1,叶子结点:直接删除该叶子

PHP 二叉查找树(二叉搜索树)的查找

如下图:在二叉查找树中,搜索节点19是否存在 代码实现: 测试结果: 原文地址:https://www.cnblogs.com/qiangqiangge/p/12283930.html

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值