设为首页 加入收藏

TOP

二叉搜索树
2015-07-20 17:39:35 来源: 作者: 【 】 浏览:3
Tags:搜索

二叉搜索树:

二叉树的查找很简单,先序后序中序都可以,一开始要判断是否为空。

插入要判断一下是否存在,查找时同时记录其父节点,然后直到找到空节点,插入。

删除比较复杂一点:

逐一判断:

先判断是否为空,然后查找到要删除的节点p,并记录其父节点q,如果查不到,返回false;

当p节点有两个子树时,查到其中序遍历的后继节点,即排序后的之后以为,记为s。查找的同时记录s的父节点r,然后将s的值复制给p,然后以s为p,r为q,将问题转换为p节点只有最多一棵子树的情况,即之后的情况。这里是因为其为中序遍历的第一个节点,这此时的p点绝对没有左子树。

当p节点只有一颗子树或没有时,将其的子树或者null赋值个c,为p的子节点,然后让其代替p在q的位置。

当p节点为根节点时,则c节点为根节点。

释放p的内存。


代码如下:


#include "BSTree.h"

template
  
   
bool BSTree
   
    ::Search(const T& x) const{ if(!root) return false; return Search(root,x); } template
    
      bool BSTree
     
      ::Search(const BTNode
      
        *p, const T& x)const{ if(!p)return false; if(p->element == x)return true; if(p->lchild)return Search(p->lchild,x); if(p->rchild)return Search(p->rchild,x); return false; } template
       
         bool BSTree
        
         :: Insert(const T& x){ if(!root) root = new BTNode
         
          (x); else{ BTNode
          
           * p = root,q = 0; while(p){ q = p; if(p->element==x)return false; else if(x < p->element)p = p->lchild; else p = p->rchild; } p = new BTNode
           
            (x); q -> rchild = p; } return true; } template
            
              bool BSTree
             
              ::Remove(const T& x){ BTNode
              
                *c,*s,*r,*p = root,*q = 0; if(p)return false; while(p &&p->element != x){ q = p; if(x < p->element) p = p->lchild; else p = p->rchild; } if(!p ) return false; if(p->lchild && p->rchild){ s = p->rchild;r = p; while(r->lchild){ r = s; s = s->lchild; } p->element = s->element; p = s; q = r; } if(p ->lchild ) c = p->rchild; else c = p->lchild; if( p == root) root = c; else if(p == q->lchild) q->lchild = c; else q->rchild = c; delete p; return true; }
              
             
            
           
          
         
        
       
      
     
    
   
  



头文件:

#ifndef BSTREE
#define BSTREE

template 
  
   
struct BTNode
{
	BTNode(){lchild =rchild = 0;}
	BTNode(const T& x){
		element = x;
		lchild =rchild = 0;
	}
	BTNode
   
    * lchild,*rchild; T element; }; template 
    
      class BSTree{ public: BSTree(){root = 0;} bool Search(const T& x) const; bool Insert(const T& x); bool Remove(const T& x); private: bool Search(const BTNode
     
       *p, const T& x)const; protected: BTNode
      
       * root; }; #endif
      
     
    
   
  






】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj2488--A Knight's Journey.. 下一篇Leetcode_num4_Reverse Integer

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)
·MongoDB 索引 - 菜鸟 (2025-12-25 17:19:45)
·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)