[关闭]
@rg070836rg 2016-03-27T13:31:40.000000Z 字数 1833 阅读 1462

二叉排序树


data_structure

一、介绍

  • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

二、功能介绍

2.1、插入和构造

插入方法:

  • 首先找到K所放置的位置,定位到已存在的某个节点。规则按照第一节介绍
  • 然后申请空间,接在树后面

注意:这里需要引用,原因本文最后进行讨论。

构造方法:

  • 每次读取一个数
  • 用插入的方法生成树

代码如下:

  1. //插入函数
  2. template <class T>
  3. void BiSortTree<T>::Insert(BiNode<T>* &p, int k) //p为根结点
  4. {
  5. if (p == NULL)//根结点
  6. {
  7. p = new BiNode<T>;
  8. p->data = k;
  9. p->lchild = p->rchild = NULL;
  10. }
  11. else
  12. {
  13. if (k < p->data) //比根结点小的插在左子树
  14. Insert(p->lchild, k);
  15. else if (k>p->data) //比根结点大的插在左子树
  16. Insert(p->rchild, k);
  17. }
  18. }
  19. template <class T>
  20. void BiSortTree<T>::Insert(int k)
  21. {
  22. Insert(root,k);
  23. }
  24. //构造函数(多次调用插入函数)
  25. template <class T>
  26. BiSortTree<T>::BiSortTree(int a[], int n)
  27. {
  28. root = NULL;
  29. for (int i = 0; i < n; i++)
  30. Insert(root,a[i]);
  31. }

2.2、删除函数


  • 传入节点为空,删除失败,返回
  • 若不空,继续定位,查找值比当前节点小,查找其左子树,否则右子树
  • 若定位成功,分三种情况删除

    • 叶子节点 --- 直接删除
    • 单支节点 --- 用孩子节点的值链接到当前节点,删除原节点
    • 双支节点 --- 考虑下二叉排序树的特点,即能想到,我要找的替代数字,应该是该节点左子树的最大孩子,也就是寻找左子树的最右孩子
  1. //删除函数
  2. template <class T>
  3. void BiSortTree<T>::Delete(BiNode<T>* &p, int k)
  4. {
  5. BiNode<T>* temp;
  6. if (p != NULL)
  7. {
  8. if (k < p->data)
  9. Delete(p->lchild, k); //查找值k比当前值小,所以在其左子树找
  10. else if (k>p->data)
  11. Delete(p->rchild, k); //查找值k比当前值大,所以在其右子树找
  12. else
  13. {
  14. if (p->lchild != NULL && p->rchild != NULL) //双支节点
  15. {
  16. //寻找左子树的最右孩子
  17. temp = p->lchild;
  18. while (temp->rchild != NULL)
  19. temp = temp->rchild;
  20. p->data = temp->data;
  21. Delete(p->lchild, temp->data);
  22. }
  23. else
  24. {
  25. temp = p;
  26. if (p->lchild == NULL)
  27. p = p->rchild;
  28. else if (p->rchild == NULL)
  29. p = p->lchild;
  30. delete temp;
  31. }
  32. }
  33. }
  34. }
  35. template <class T>
  36. void BiSortTree<T>::Delete(int k)
  37. {
  38. Delete(root, k);
  39. }

2.3、查找函数

查找过程类似插入过程:

  • 二叉树为空,查找失败,
  • 查找值小于当前节点的值,递归查找左子树
  • 查找值大于当前节点的值,递归查找右子树
  1. //查找函数
  2. template <class T>
  3. BiNode<int>* BiSortTree<T>::Search(BiNode<T>* p, int k) //查找值为k的结点
  4. {
  5. if (p == NULL) //递归出口
  6. return NULL;
  7. else if (p->data == k)
  8. return p;
  9. else if (k < p->data)
  10. return Search(p->lchild, k);
  11. else
  12. return Search(p->rchild, k);
  13. }
  14. template <class T>
  15. void BiSortTree<T>::Search(int k)
  16. {
  17. if (Search(root, k)==NULL)
  18. cout << "未查找到" << endl;
  19. else
  20. cout << "查到为:" << Search(root, k)->data << endl;
  21. }

三、引用

3.1、插入

文档中的两个函数,需要有引用才能正确。我们先看插入函数。
(1)
此处输入图片的描述
(2)
此处输入图片的描述
(3)
此处输入图片的描述
(4)
此处输入图片的描述
(5)
此处输入图片的描述
(6)
此处输入图片的描述

3.2、删除

再看一个影响到的函数,删除函数,这个似乎更加复杂。
(1)
此处输入图片的描述
(2)
此处输入图片的描述
(3)
此处输入图片的描述
(4)
此处输入图片的描述
(5)
此处输入图片的描述

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注