手写BST插入查找删除

binary search\sort\find tree operations

status InsertNode(Node* root, data x, Node* father)
{
	if(root==NULL)
	{
		if(father==NULL)
			Tree empty;
		else
		{
			if(x<father->data)
			{
				father->left=new Node//inital left right NULL
				father->left->data=x;
				return  success;
			}
			else if(father->data<x)
			{
				father->right=new Node;//inital left right NULL
				father->right->data=x;
				return succes;
			}
			else
			{
				return failure, have same data in BST//Hash also not allowed same data, but other such as array allow
			}
		}
	}
	if(x<root->data) InsertNode(root->left,x); //imitate big god fawks's code style : )
	else if(root->data<x) InsertNode(root->right,x);
	else
		return falure, have same data in BST;
}

后来发现,根本不需要father, 会出现上面的原因是我总以为指针为空,指针变量也不能在赋值了。有个错误理解,指针变量是一个变量,他的值为空,现在可以让他指向其他的地方,例如申请一个堆空间,他的值就是这个新的空间的地址值。



status InsertNode(Node* root, data x)
{
	if(root==NULL)
	{
		root=new Node;//assume initial left right NULL
		root->data=x;
	}
	if(x<root->data) InsertNode(root->left,x); //imitate big god fawks's code : )
	else if(root->data<x) InsertNode(root->right,x);
	else
		return falure, have same data in BST;
}
Node* FindNode(Node* root, data x, Node* father)//use father for delete recall
{
	if(root==NULL) return NULL;
	if(x<root->data) FindNode(root->left, x,root);
	else if(root0>data<x) FindNode(root->right,x,root);
	else
		return root;
}
status DeleteNode(Node* root, data x)
{
	Node* parent=NULL;
	Node* p=FindNode(root,x,parent);
	if(p==NULL)
		return failure, can not found x;
	if(parent==NULL)//BST only has a root
		return success root==NULL;//set BST as NULL
	if(p==parent->left)
	{
		if(p-left!=NULL)
		{
			move p's right child as p's leftchild's rightdownmost node's right child
			parent->left=p->left;
		}
		else if(p->right!=NULL)
		{
			move p's left child as p's rightchild's leftdownmost node's left child;
			parent->left=p->right;
		}
		else// all null
		{
			parent->left==NULL;
		}
		delete p;
	}
	if(p==parent->right)
	{
		follow left part;
	}
	return sucess;
}

总结指针bug就是 每次访问left right,都要考虑是否p为空,如果有空就另外处理,否则NULL访问left right 程序就crash了。

手写BST插入查找删除

时间: 2024-09-28 19:35:13

手写BST插入查找删除的相关文章

HDU 5687 字典树插入查找删除

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 1 #include<stdio.h> 2 #include<string.h> 3 struct node{ 4 int next[27]; 5 int cnt; 6 void init(){ 7 cnt = 0;//计数 8 memset(next,-1,sizeof(next)); 9 } 10 };

2019秋招复习笔试--手写代码

1. 手写一个单例模式 2. 手写一个生产者消费者模式 3. 手写一个LRU算法的实现: 4. 手写快排 5. 手写堆排 6. 手写树的遍历(先序.中序.后序.层序) 7. 手写一个二分查找 #. 剑指OFFER #. LeetCode 原文地址:https://www.cnblogs.com/greatLong/p/11505100.html

二叉排序树(BST):创建、查找、插入与删除

删除结点的相关操作(左右子树均为非空的删除结点的方法): 算法分析: 下面以实例来说明二叉排序树的创建.查找.插入和删除等相关操作: 如输入关键字序列(45,24,37,12,54,93),然后对其进行相应的操作,程序如下: #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct BiTNode { int value; struct B

重温数据结构:二叉排序树的查找、插入、删除

读完本文你将了解到: 什么是二叉排序树 Binary Sort Tree BST 二叉排序树的关键操作 查找 插入 删除 运行代码测试 一道面试题 总结 Thanks 我们知道,二分查找可以缩短查找的时间,但是有个要求就是 查找的数据必须是有序的.每次查找.操作时都要维护一个有序的数据集,于是有了二叉排序树这个概念. 上篇文章 我们介绍了 二叉树 的概念,二叉树有左右子树之分,想必在区分左右子树时有一定的规则. 现在我们来介绍二叉树的一种特殊形式 - 二叉排序树,了解它的区分策略及常用操作. 什

[Codevs 1230]元素查找(手写哈希表)

题目连接:http://codevs.cn/problem/1230/ 说白了就是要我们自己手写一个哈希表的数据结构来实现添加和查找功能,map也能直接过(我第一次写就是用map骗AC的) 提一下个人理解的哈希表的实现(下面说的是线性寻址法),如果有误还请各位大神不吝指教 用一个数组模拟哈希表,函数f(x)=数字x在哈希表中出现的下标的最小可能值,一般f(x)=x mod t,t就是哈希表的长度 下面就是一个哈希表的示例,如果遍历哈希表时指针走出了哈希表的终点,就进入起点重新遍历 对于每次向哈希

二叉查找树的查找、插入和删除 - Java实现

http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 作者: yangecnu(yangecnu's Blog on 博客园) 出处:http://www.cnblogs.com/yangecnu/ 英文原文的出处:http://algs4.cs.princeton.edu/32bst/ 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的时候具有较高的灵活性,而有序数组在查找时具有较高的效率,本文介绍

闭散列表的查找、插入和删除操作的完整C代码

/*闭散列表的建立.查找.插入.删除*/ #include <stdio.h> #define NIL -1 //假设关键字为非负整数 #define DEL -2 typedef int KeyType; KeyType HashTable[13]; //便于验证算法,关键字个数假定为不超过13,哈希表长定为13 //关键字插入函数 void InsertHashTable(KeyType k) { for(int i=0; i<13; i++) if( NIL == HashTabl

android项目 之 记事本(7)----- 手写功能之删除、恢复和清空

上一节,为记事本添加了手写的功能,但是没有实现底部按钮的各种功能,这节就先实现撤销,恢复和清空的功用. 因为不会录制屏幕成gif图片,所以就以图片形式给出吧,不是很形象,凑合着看: 显然,需要为底部GridView的添加item单击事件: private GridView paint_bottomMenu; paint_bottomMenu = (GridView)findViewById(R.id.paintBottomMenu); paint_bottomMenu.setOnItemClic

支持泛型AVL Tree的简单实现,并和STL map比较了插入,删除,查找的性能

1.问题描述: 1)AVL tree是一种自平衡树.它通过左右子树的高度差来控制树的平衡,当高度差是不大于1的时候,认为树是平衡的.树的平衡保证了树在极端情况下 (输入序列不够随机)的性能.很显然当左右子树高度平衡,保证了任何插入,删除,查找操作平均性能呢个,当不平衡时(有的子树很高),当 要操作的元素在这个子树时,性能会很差: 2)AVL tree 和Red black tree 都是一种平衡树,它的操作的时间复杂度是:O(lgN) ,N是树的节点的数目: 3)本文实现了AVL Tree, 并