zoukankan      html  css  js  c++  java
  • 二叉搜索树

    二叉搜索树:

    二叉树的查找非常easy。先序后序中序都能够。一開始要推断是否为空。

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

    删除比較复杂一点:

    逐一推断:

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

    当p节点有两个子树时,查到当中序遍历的后继节点。即排序后的位于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<typename T>
    bool BSTree<T>::Search(const T& x) const{
    	if(!root) return false;
    	return Search(root,x);
    }
    
    template<typename T>
    bool BSTree<T>::Search(const BTNode<T> *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<typename T>
    bool BSTree<T>:: Insert(const T& x){
    	if(!root)
    		root = new BTNode<T>(x);
    	else{
    		BTNode<T>* 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<T>(x);
    		q -> rchild = p;
    	}
    	return true;
    }
    
    
    template<typename T>
    bool BSTree<T>::Remove(const T& x){
    	BTNode<T> *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 <typename T>
    struct BTNode
    {
    	BTNode(){lchild =rchild = 0;}
    	BTNode(const T& x){
    		element = x;
    		lchild =rchild = 0;
    	}
    	BTNode<T>* lchild,*rchild;
    	T element;
    }; 
    
    template <typename T>
    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<T> *p, const T& x)const;
    protected:
    	BTNode<T>* root;
    
    };
    
    #endif






  • 相关阅读:
    mysql函数
    maven 配置自动本地/线上不同配置自动打包
    maven clean后 编译报错
    htmlunit填坑
    java正则表达式移除网页中注释代码
    spark 计算结果写入mysql 案例及常见问题解决
    pychrome激活
    hadoop集群常见问题解决
    hadoop+spark集群搭建
    C++:构造函数2——拷贝构造函数
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7221084.html
Copyright © 2011-2022 走看看