C++数据结构====二叉查找树

C++二叉查找树:Binary Search tree

二叉查找树默认左子树的值都比根节点小,右子树都比根节点大,这个定义排除了树中存在值相同节点的可能性。这便是二叉查找树称为一个用关键值KEY快速查找的工具。

二叉树类:

class bst
{
    struct Node
    {
        T data;
        Node* L;
        Node* R;
        Node(const T& d):data(d),L(),R(){}
        Node(const T& d,Node* L,Node* R):data(d),L(L),R(R){}
    };
    typedef Node* tree;
    Node* rp;//指向根节点指针
    int n;//记录节点个数
};

1.插入一个节点; void(tree& t,Node* p)//在一棵树树中插入一个节点

if(空树),作为根结点插入

if(大于根节点值),插入右子树

else   插入左子树

    void myinsert(tree& t,Node* p)//在一棵树中插入一个节点
    {
         if(t == NULL)
            t = p;
            else if(p->data < t->data)
                 myinsert(t->L,p);
                 else
                    myinsert(t->R,p);
    }

2.查找一个节点: tree& (tree& t,const  T& d)//在一棵树中寻找节点d,返回一个指向这个节点的指针。

if(t==NULL) return t;

if(t->data==d) return t;

if(d <  t->data)  return 左子树中查找

else return右子树查找

    tree& myfind(tree& t,const T& d)//返回以d为根节点的子树的根指针
    {
        if(t==NULL)
            return t;
        else if(d==t->data) return t;//没找到
             else  if(d<t->data) return myfind(t->L,d);//return 一定要带上
                   else return myfind(t->R,d);
    }
    void tr

3.删除一个节点:void dele(tree& t,const T& d)

特殊:

叶子节点----->直接delete

单子节点---->让父节点指向子节点,delete

双子节点---->左右子树合并

1.找到这个节点,即返回指向这个节点的指针pn

2.备份一份指针p=pn

3.左右子树合并(左子树插入到右子树 或者 右子树插入到左子树)

4.Delete 节点

5.节点数-1

    bool dele(const T& d){//返回那个节点的根指针,另存一份
                          //左右子树合并,根指针指向右子树,释放节点
        tree& t = myfind(d);
        if(t == NULL) return false;
        Node* p = t;
        if(t->L!=NULL) myinsert(t->R,t->L);
        t = t->R;
        delete p;
        --n;
        return true;
    }

4修改一个节点; void(const T& olddata,const T& newdata)

1,删掉这个节点

2.插入一个节点

    void update(const T& olddata,const T& newdata)
    {
        dele(olddata);
        myinsert(newdata);
    }

5.遍历二叉树  //中根遍历

遍历左子树

遍历根节点

遍历右子树

    void travel(const tree& t)const
    {
        if(t != NULL)
        {
            travel(t->L);
            cout << t->data <<' ';
            travel(t->R);
        }
    }

6.清空一棵树

先清左子树

在清右子树

delete根节点

    void clean(tree& t)//清空一棵树
    {
        if(t!=NULL)
        {
            clean(t->L);
            clean(t->R);
            delete t;t=NULL;
        }

    }

7.求树的深度

   int high(tree& t)const//求一棵树的高度
    {
        if(t == NULL) return 0;
        int lh=high(t->L);
        int rh=high(t->R);
        return 1+std::max(lh,rh);
    }

8.二叉树的层次遍历

1.如果是空树,over

2.创建队列,根节点进队

3 只要队列不为空,

3.1 出队一个元素

3.2访问其中数据

3.3左右非空子树入队

    void prin(tree& t)
    {
        if(!t) return;
        deque<tree> di;
        di.push_back(t);
        while(!di.empty())
        {
            tree& t=di.front();
            cout << t->data << ' ';
            if(t->L)
                di.push_back(t->L);
            if(t->R)
                di.push_back(t->R);
        }
    }

加换行符,每层遍历加一个换行

1.如果是空树,over

2.创建队列,根节点进队,NULL进队

3 只要队列size>1,

3.1 出队一个元素

3.2如果是NULL,换行,NULL进队尾。continue

3.2访问其中数据

3.3左右非空子树入队

    void print(tree& t )
    {
      if(t==NULL)
      return;
      deque<tree> di;//创建队列
      di.push_back(t);//根节点入队
      di.push_back(NULL);
      while(di.size()!=1)//只要非空
      {
        tree& t=di.front();//取出一个元素
        if(t==NULL)
        {
            cout << endl;
            di.pop_front();
            di.push_back(NULL);
            continue;
        }
        cout << t->data << ' ';//访问数据
        di.pop_front();
        if(t->L)
        di.push_back(t->L);//左右子树非空节点入队
        if(t->R)
        di.push_back(t->R);
      }
    }
时间: 2024-11-02 13:05:03

C++数据结构====二叉查找树的相关文章

数据结构—二叉查找树

查找树是一种数据结构,二叉查找树是按二叉树结构来组织的.可以用链表结构表示,其中每一个结点就是一个对象.结点中包括:key.数据.left.right.p.其中left.right和p分别指向左儿子,右儿子和父结点. 二叉查找树中的关键字总是满足二叉查找树的性质:y是x左子树上的结点,则key[y]≤key[x],如果y是x右子树上的结点,则key[y]≥key[x]. 遍历: 根据二叉查找树的性质,可以用一个递归算法按排列顺序输出树中的所有关键字.这种是中序遍历算法:因为一子树根的关键字在输出

数据结构——二叉查找树

使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值.这意味着,该树所有的元素以某种统一的方式排序. 二叉查找树的声明 二叉查找树是一棵特殊的二叉树,二叉查找树中节点的结构与二叉树种节点的结构相同,关键在于可以在二叉查找树上可以执行的操作以及对其进行操作的算法.二叉查找树的声明如下: #ifndef  _Tree_H struct TreeNode; typedef struct TreeNode *Posit

数据结构-二叉查找树

前序遍历: 后序遍历: 二叉查找树按照二叉树进行组织.二叉查找树关键字的存储方式总是瞒住二叉查找树性质: 设x为二查查找树种一个节点.如果y是x的左子树中的一个节点,那么key[x] >= key[y].如果y是x的右子树的一个节点,那么key[x] <= key[y]. 这样对二叉查找树进行中序遍历就可得到书中所有元素的一个非降序排列. 查找某一个存在节点的前驱和后继.某一个节点x的后继就是大于key[x]的关键字中最小的那个节点,前驱就是小于key[x]的关键字中最大的那个节点.查找二叉前

JAVA数据结构--二叉查找树

二叉查找树定义 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值: 任意节点的左.右子树也分别为二叉查找树: 没有键值相等的节点. 二叉查找树相比于其他数据结构的优势在于查找.插入

Java数据结构-二叉查找树续以及平衡二叉查找树

??前面一篇文章讲到了二叉查找树的实现,其中的插入操作是使用非递归方法实现的,这里再增加一种递归实现插入的操作,Java代码如下,建议增加到前一篇文章对应的FOBinarySearchTree.java中: /** * @TODO 二叉排序树插入元素(递归方法) * @param e 需要插入的元素 * @return true or false */ public boolean insert(E e){ insert(root,e); return true; } /** * @TODO 二

数据结构--二叉查找树的java实现

上代码: package com.itany.erchachazhaoshu; public class BinarySearchTree<T extends Comparable<? super T>> { //定义二叉查找树的根节点 每一个查找二叉树都有一个自己的root 节点 root外界看不到 private BinaryNode<T> root; public BinarySearchTree() { root=null; } //节点类 private st

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

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

详解二叉查找树(BST)

详解二叉查找树(BST) 本篇随笔简单讲解一下数据结构--二叉查找树(\(Binary\,\,Sort\,\,Tree,BST\)),(后文的"二叉查找树"一词均用\(BST\)代替). BST的概念 首先,\(BST\)是一棵二叉树. 它的定义是,根节点左子树全部严格小于根节点,右子树大于等于根节点,并且,左右子树都是\(BST\). 很好理解,很明朗很简单的定义. 可以看出,这是一个通过递归方式定义的数据结构,所以,它的诸多操作自然要用到递归. BST的功能 我们可以看出来,这个二

查找与二叉树

查找与二叉树 我家园子有几棵树系列 查找与二叉树 我家园子有几棵树系列 Preface 查找 二叉查找树的实现 定义数据结构 中序遍历 查找操作 插入 删除 删除最小值 复制(拷贝)删除 步骤 Rank 2-3查找树 总结 Preface 前面我们学习了基于线性表的数据结构,如数组,链表,队列,栈等.现在我们要开始学习一种非线性的数据结构--树(tree),是不是很兴奋呢!让我们开始新的系列吧! 查找 先让我们回忆一下线性表的查找,首先最暴力的方法就是做一个线性扫描,一一对比是不是要找的值.这么