二叉查找树python实现

1. 二叉查找树的定义:

左子树不为空的时候,左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点,左右子树分别为二叉查找树

2. 二叉查找树的最左边的结点即为最小值,要查找最小值,只需遍历左子树的结点直到为空为止,同理,最右边的结点结尾最大值,要查找最大值,只需遍历右子树的结点直到为空为止。二叉查找树的插入查找和删除都是通过递归的方式来实现的,删除一个结点的时候,先找到这个结点S,如果这个结点左右孩子都不为空,这时并不是真正的删除这个结点S,而是在其右子树找到后继结点,将后继结点的值付给S,然后删除这个后继结点即可。如果结点S的左孩子或者右孩子为空,可以直接删除这个结点S。

3. 二叉查找树的python实现:

class TreeNode:
	def __init__(self,val):
		self.val=val;
		self.left=None;
		self.right=None;
def insert(root,val):
	if root is None:
		root=TreeNode(val);
	else:
		if val<root.val:
			root.left=insert(root.left,val);   #递归地插入元素
		elif val>root.val:
			root.right=insert(root.right,val);
	return root;

def query(root,val):
	if root is None:
		return ;
	if root.val is val:
		return 1;
	if root.val <val:
		return query(root.right,val);  #递归地查询
	else:
		return query(root.left,val);
def findmin(root):
	if root.left:
		return findmin(root.left);
	else:
		return root;

def delnum(root,val):
	if root is None:
		return ;
	if val<root.val:
		return delnum(root.left,val);
	elif val>root.val:
		return delnum(root.right,val);
	else:                                             # 删除要区分左右孩子是否为空的情况
		if(root.left and root.right):

			tmp=finmin(root.right);             #找到后继结点
			root.val=tmp.val;
			root.right=delnum(root.right,val);    #实际删除的是这个后继结点

		else:
			if root.left is None:
				root=root.right;
			elif root.right is None:
				root=root.left;
	return root;

#测试代码
root=TreeNode(3);
root=insert(root,2);
root=insert(root,1);
root=insert(root,4);

#print query(root,3);
print query(root,1);
root=delnum(root,1);
print query(root,1);

二叉查找树python实现,布布扣,bubuko.com

时间: 2024-12-18 21:52:53

二叉查找树python实现的相关文章

[leetcode] Validate Binary Search Tree (检验是否为二叉查找树) Python

Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contains only nodes with keys

Python爬取CSDN博客文章

之前解析出问题,刚刚看到,这次仔细审查了 0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结1.基础底层数据结构1.1.简单动态字符串SDS定义: ...47分钟前1 url :http://blog.csdn.net/youyou1543724847/

[leetcode]Convert Sorted List to Binary Search Tree @ Python

原题地址:http://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题意:将一条排序好的链表转换为二叉查找树,二叉查找树需要平衡. 解题思路:两个思路:一,可以使用快慢指针来找到中间的那个节点,然后将这个节点作为树根,并分别递归这个节点左右两边的链表产生左右子树,这样的好处是不需要使用额外的空间,坏处是代码不够整洁.二,将排序好的链表的每个节点的值存入一个数组中,这样就和http://www.cnblog

lintcode 容易题:Insert Node in a Binary Search Tree 在二叉查找树中插入节点

题目:  在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树.  样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 挑战 能否不使用递归? 解题: 递归的方法比较简单 Java程序: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public

[leetcode]Unique Binary Search Trees II @ Python

原题地址:https://oj.leetcode.com/problems/unique-binary-search-trees-ii/ 题意:接上一题,这题要求返回的是所有符合条件的二叉查找树,而上一题要求的是符合条件的二叉查找树的棵数,我们上一题提过,求个数一般思路是动态规划,而枚举的话,我们就考虑dfs了.dfs(start, end)函数返回以start,start+1,...,end为根的二叉查找树. 代码: # Definition for a binary tree node #

[leetcode]Convert Sorted Array to Binary Search Tree @ Python

原题地址:http://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 题意:将一个排序好的数组转换为一颗二叉查找树,这颗二叉查找树要求是平衡的. 解题思路:由于要求二叉查找树是平衡的.所以我们可以选在数组的中间那个数当树根root,然后这个数左边的数组为左子树,右边的数组为右子树,分别递归产生左右子树就可以了. 代码: # Definition for a binary tree node # class

二叉排序树(C与Python分别实现)

1.      什么是二叉排序树? 二叉排序树是一种特殊的二叉树,可以是一棵空树,也可以是具有下列性质的二叉树: 1.      若左子树不为空,那么左子树所有结点的值都小于它的根结点的值. 2.      若右子树不为空,那么右子树所有结点的值都大于它的根节点的值. 3.      它的左右子树也分别是二叉排序树. 二叉排序树又称二叉查找树,是一种动态查找表,所谓动态查找表是指除了查询检索操作以外,还可以进行插入.删除操作的结构:与之相对应的就是静态查找表,只能进行查询检索操作. 2.    

支持中文的基于词为基本粒度的前缀树(prefix trie)python实现

Trie树,也叫字典树.前缀树.可用于"predictive text"和"autocompletion".亦可用于统计词频(边插入Trie树边更新或加入词频). 在计算机科学中.trie,又称前缀树或字典树.是一种有序树,用于保存关联数组,当中的键一般是字符串.与二叉查找树不同.键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的全部子孙都有同样的前缀,也就是这个节点相应的字符串,而根节点相应空字符串. 普通情况下,不是全部的节点都有相应的值,仅仅有叶子

基本数据结构(算法导论)与python

原文链接 Stack, Queue Stack是后进先出, LIFO, 队列为先进先出, FIFO在Python中两者, 都可以简单的用list实现,进, 用append()出, Stack用pop(), Queue用pop(0), pop的时候注意判断len(l) 对于优先队列, 要用到前面讲到的堆 链表和多重数组 这些数据结构在python中就没有存在的价值, 用list都能轻松实现 散列表 为了满足实时查询的需求而产生的数据结构, 查询复杂度的期望是O(1), 最差为O(n)问题描述, 对