zoukankan      html  css  js  c++  java
  • 二叉查找树

    二叉查找树(Binery Search Tree),要么是一颗空树,要么是具有以下性质的二叉树:

    (1)    要是结点的左子树不为空,则左子树的所有结点的值小于该结点的值

    (2)    要是结点的右子树不为空,则右子树的所有结点的值大于该结点的值

    (3)    该结点的左右子树也是二叉查找树

    二叉查找树通常用二叉链表存储结点。中序遍历二叉查找树可以得到关键字有序的序列,一个无序的序列可以通过构造一棵二叉查找树,再中序遍历得到一棵有序的链表。每次插入的位置都是叶子结点,插入时不用移动其他结点。搜索、插入、删除结点的复杂度为树高,即O(logn)(数列有序,退化成线性表,此时的复杂度为O(n))

     

    查找

    二叉查找树T查找关键字val的过程为:

    • T为空树,查找失败,否则:
    • val 等于T的关键字,查找成功,返回。否则
    • val 小于T的关键字,继续查找T的左子树。否则
    • 查找T的右子树。

     

    bool SearchBST(BiTree T, int val, BiTree f, BiTree &p)
    {
    	if(!T)
    	{
    		p = f;
    		return false;
    	}
    	else if(val == T->data)
    	{
    		p = T;
    		return true;
    	}
    	else if(val < T->data)
    		SearchBST(T->left, val, T, p);
    	else
    		SearchBST(T->right, val, T, p);
    }
    

     

     

    插入

    二叉查找树T插入关键字为val的结点s过程为:

    如果在二叉查找树T中没有找到关键字为val的结点(查找过程返回的结点为p):

    • 如果p为空,则s直接赋给p
    • 如果val小于p的关键字,插入到p的左子树上
    • 如果val大于p的关键字,插入到p的右子树上

     

    bool InsertBST(BiTree &T, int val)
    {
    	BiTree p = NULL;
    	if(!SearchBST(T, val, NULL, p))
    	{
    		BiTree node = new BiTNode;
    		node->data = val;
    		node->left = node->right = NULL;
    		if(!p)
    			T = node;
    		else if(val < p->data)
    			p->left = node;
    		else
    			p->right = node;
    		return true;
    	}
    	return false;
    }
    

     

     

    删除

    删除结点为p

    • p为叶子结点,直接删掉
    • p只有左子树,则把自己替换成左子树
    • p只有右子树,则把自己替换成右子树
    • 若左右子树都有,则把自己的关键字替换成左子树中最靠右的关键字,同时干掉最右边的关键字

     

    bool Delete(BiTree &T)
    {
    	if(!T->left && !T->right)
    	{
    		delete T;
    		T = NULL;
    	}
    	else if(!T->left)
    	{
    		BiTree p = T;
    		T = T->right;
    		delete p;
    		p = NULL;
    	}
    	else if(!T->right)
    	{
    		BiTree p = T;
    		T = T->left;
    		delete p;
    		p = NULL;
    	}
    	else
    	{
    		BiTree p = T, q = T->left;
    		while(q->right)
    		{
    			p = q;
    			q = q->right;
    		}
    		if(T == p)
    		{
    			T->data = q->data;
    			T->left = q->left;
    			delete q;
    			q = NULL;
    		}
    		else
    		{
    			T->data = q->data;
    			p->right = NULL;
    			delete q;
    			q = NULL;
    		}
    	}
    	return true;
    }
    
    bool DeleteBST(BiTree &T, int val)
    {
    	if(!T)
    		return false;
    	else
    	{
    		if(val == T->data)
    			return Delete(T);
    		else if(val < T->data)
    			return DeleteBST(T->left, val);
    		else
    			return DeleteBST(T->right, val);
    	}
    }
    

     

     完整参考代码

    #include <iostream>
    #include <vector>
    using namespace std;
    
    typedef struct BiTNode
    {
        int data;
        BiTNode *left;
        BiTNode *right;
    }BiTNode, *BiTree;
    
    bool SearchBST(BiTree T, int val, BiTree f, BiTree &p)
    {
        if(!T)
        {
            p = f;
            return false;
        }
        else if(val == T->data)
        {
            p = T;
            return true;
        }
        else if(val < T->data)
            SearchBST(T->left, val, T, p);
        else
            SearchBST(T->right, val, T, p);
    }
    
    bool InsertBST(BiTree &T, int val)
    {
        BiTree p = NULL;
        if(!SearchBST(T, val, NULL, p))
        {
            BiTree node = new BiTNode;
            node->data = val;
            node->left = node->right = NULL;
            if(!p)
                T = node;
            else if(val < p->data)
                p->left = node;
            else
                p->right = node;
            return true;
        }
        return false;
    }
    
    bool Delete(BiTree &T)
    {
        if(!T->left && !T->right)
        {
            delete T;
            T = NULL;
        }
        else if(!T->left)
        {
            BiTree p = T;
            T = T->right;
            delete p;
            p = NULL;
        }
        else if(!T->right)
        {
            BiTree p = T;
            T = T->left;
            delete p;
            p = NULL;
        }
        else
        {
            BiTree p = T, q = T->left;
            while(q->right)
            {
                p = q;
                q = q->right;
            }
            if(T == p)
            {
                T->data = q->data;
                T->left = q->left;
                delete q;
                q = NULL;
            }
            else
            {
                T->data = q->data;
                p->right = NULL;
                delete q;
                q = NULL;
            }
        }
        return true;
    }
    
    bool DeleteBST(BiTree &T, int val)
    {
        if(!T)
            return false;
        else
        {
            if(val == T->data)
                return Delete(T);
            else if(val < T->data)
                return DeleteBST(T->left, val);
            else
                return DeleteBST(T->right, val);
        }
    }
    
    void InorderTraversal(BiTree T)
    {
        if(T)
        {
            InorderTraversal(T->left);
            cout << T->data << endl;
            InorderTraversal(T->right);
        }
    }
    
    int main()
    {
        int array[] = {7, 2, 10, 9, 2, 0, 1};
        int len_array = sizeof(array) / sizeof(*array);
        vector<int> vec(array, array + len_array);
        BiTree root = NULL;
        for(vector<int>::iterator beg = vec.begin(), end = vec.end();
                beg != end; ++ beg)
        {
            InsertBST(root, *beg);
        }
        InorderTraversal(root);
        DeleteBST(root, 10);
        cout << endl;
        InorderTraversal(root);
        cout << endl;
        DeleteBST(root, 1);
        InorderTraversal(root);
    }
    View Code

     

     

  • 相关阅读:
    在Spring Boot中使用Swagger2
    初识设计模式之简单工厂模式、工厂方法模式、抽象工厂模式
    基于百度AI接口的微信小程序-数字识别
    微信小程序实现自定义遮罩
    微信小程序之视图容器movable-view实现拖拽功能
    微信小程序之map组件初体验
    基于百度AI接口的微信小程序-人脸搜索
    基于百度AI接口的微信小程序-图像搜索
    微信小程序实现上拉加载(分页加载)
    微信小程序实现下拉刷新
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3428307.html
Copyright © 2011-2022 走看看