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

    性质

    • 左孩子<=结点<右孩子

    二叉查找树

    struct node
    {
    	int data;
    	node* left;
    	node* right;
    };
    

    二叉查找树的查找

    //二叉查找树的查找
    void search(node*root,int v)
    {
    	if (root == NULL)
    	{
    		//没找到
    		return;
    	}
    	if (root->data == v)
    	{
    		//找到了
    		return;
    	}
    	if (root->data > v)
    	{
    		//找左边
    		search(root->left,v);
    	}
    	if (root->data < v)
    	{
    		//找右边
    		search(root->right, v);
    	}
    
    }
    

    二叉查找树的插入

    //二叉查找树的插入
    void insert(node* &root, int v)
    {
    	if (root == NULL)
    	{
    		//没找到
    		root = new node;
    		root->data = v;
    		root->left = NULL;
    		root->right = NULL;
    		return;
    	}
    	if (root->data == v)
    	{
    		//找到了
    		return;
    	}
    	if (root->data > v)
    	{
    		//插左边
    		insert(root->left, v);
    	}
    	if (root->data < v)
    	{
    		//插右边
    		insert(root->right, v);
    	}
    }
    

    二叉查找树的的创建

    //二叉查找树的的创建
    node* create(int datas[],int n)
    {
    	node* root =NULL;
    	for (int i = 0; i < n; i++)
    	{
    		insert(root, datas[i]);
    	}
    	return root;
    }
    

    删除

    //删除
    //找到一个结点的前驱结点(左子树的最右子树)
    node* findPre(node* root)
    {
    	if (root == NULL)
    		return NULL;
    	node* p = root->left;
    	if (p == NULL)
    		return NULL;
    	node* q = p->right;
    	while (q!=NULL)
    	{
    		p = p->right;
    		q = p->right;
    	}
    	return p;
    }
    //找到一个结点的后继结点(右子树的最左子树)
    node* findPost(node* root)
    {
    	if (root == NULL)
    		return NULL;
    	node* p = root->right;
    	if (p == NULL)
    		return NULL;
    	node* q = root->left;
    	while (q != NULL)
    	{
    		p = p->left;
    		q = p->left;
    	}
    	return p;
    }
    //删除一个结点
    void deleteNode(node*& root,int v)
    {
    	if (root == NULL)
    		return;
    	if (root->data == v)//找到欲删除节点
    	{
    		if (root->left == NULL && root->right == NULL)
    			root = NULL;
    		else if (root->left != NULL)//找到前驱
    		{
    			node* pre = findPre(root);
    			root->data = pre->data;
    			deleteNode(root->left, pre->data);
    			//使用前驱节点的左孩子代替前驱节点(因为没有右孩子),前驱节点的父节点指向前驱节点的左孩子
    		}
    		else if (root->right != NULL)
    		{
    			node* post = findPost(root);
    			root->data = post->data;
    			deleteNode(root->right, post->data);
    		}
    	}
    	else if (root->data > v)
    	{
    		deleteNode(root->left, v);
    	}
    	else {
    		deleteNode(root->right, v);
    	}
    }
    
    • 注:删除优化小技巧:使用前驱节点的左孩子代替前驱节点(因为没有右孩子),前驱节点的父节点指向前驱节点的左孩子
  • 相关阅读:
    CDH简易离线部署文档
    算法图解读书笔记
    html 知识整理
    Django admin 组件 原理分析与扩展使用 之 sites.py (一)
    阿里云 centos7 django + uWSGI+Nginx + python3 部署攻略
    git 命令和使用场景总结
    由select引发的思考
    Python 实现单例模式的一些思考
    pep 8 规范的一些记录
    python 垃圾回收机制的思考
  • 原文地址:https://www.cnblogs.com/code-fun/p/15227464.html
Copyright © 2011-2022 走看看