简介

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
如下图所示:
图片来自百度百科
二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。

中序遍历二叉排序树可得到一个关键字的有序序列

一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,O(log(n)).

查找算法

在二叉排序树b中查找x的过程为:
若b是空树,则搜索失败,否则:
若x等于b的根结点的数据域之值,则查找成功;否则:
若x小于b的根结点的数据域之值,则搜索左子树;否则:
查找右子树。

插入算法

向一个二叉排序树b中插入一个结点s的算法,过程为:
若b是空树,则将s所指结点作为根结点插入,否则:
若s->data等于b的根结点的数据域之值,则返回,否则:
若s->data小于b的根结点的数据域之值,则把s所指结点插入到左子树中,否则:
把s所指结点插入到右子树中。

Leetcode 230. 二叉搜索树中第K小的元素

给定一个二叉搜索树,编写一个函数kthSmallest来查找其中第k个最小的元素。
注意:
你可以假设k总是有效的,1≤ k ≤二叉搜索树元素个数。
进阶:
如果经常修改二叉搜索树(插入/删除操作)并且你需要频繁地找到第k小值呢? 你将如何优化kthSmallest函数?

法1:递归

按顺序中序遍历每个节点,并实时的减小K的值,直到K的值为0则当前节点的值即为第K小的元素

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def kthSmallest(self, root, k):""":type root: TreeNode:type k: int:rtype: int"""if root:x = self.kthSmallest(root.left,k)if  k == 0:return xelse:k = k -1if k == 0:return root.valelse:return self.kthSmallest(root.right,k)

法2:迭代查找

使用栈,先进先出

例子,二分查找树:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:# 返回对应节点TreeNodedef KthNode(self, pRoot, k):# write code hereif k == 0 or pRoot is None:return Noneq = [(pRoot, False)]while q:cur, flag = q.pop()if cur:if flag:k -= 1if k==0:return curelse:q.append((cur.right, False))q.append((cur, True))q.append((cur.left, False))

中序遍历操作过程,q中的元素变化:

  1. 5F
  2. 7F 5T 3F
  3. 7F 5T 4F 3T 2F
  4. 7F 5T 4F 3T N 2T N
  5. 7F 5T 4F 3T N 2T
  6. 7F 5T 4F 3T N ———————> 2
  7. 7F 5T 4F 3T
  8. 7F 5T 4F ———————> 2,3
  9. 7F 5T N 4T N
  10. 7F 5T N 4T
  11. 7F 5T N ————————>2,3,4
  12. 7F 5T
  13. 7F ————————>2,3,4,5
  14. 8F 7T 6F
  15. 8F 7T N 6T N
  16. 8F 7T N 6T
  17. 8F 7T N ———–>2,3,4,5,6
  18. 8F 7T
  19. 8F —————>2,3,4,5,6,7
  20. N 8T N
  21. N 8T
  22. N —————->2,3,4,5,6,7,8

二叉树遍历非递归模板

中序遍历(左右根)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""result, stack = [], [(root, False)]while stack:cur, flag = stack.pop()if cur:if flag:result.append(cur.val)else:stack.append((cur.right, False))stack.append((cur, True))stack.append((cur.left, False))return result

前序遍历(根左右)

stack.append((cur.right, False))
stack.append((cur.left, False))
stack.append((cur, True))

后序遍历(左右根)

stack.append((cur, True))
stack.append((cur.right, False))
stack.append((cur.left, False))


二叉树遍历递归模板

中序遍历

# recursively
def inorderTraversal1(self, root):res = []self.helper(root, res)return resdef helper(self, root, res):if root:self.helper(root.left, res)res.append(root.val)self.helper(root.right, res)

前序遍历

# recursively
def inorderTraversal1(self, root):res = []self.helper(root, res)return resdef helper(self, root, res):if root:res.append(root.val)self.helper(root.left, res)self.helper(root.right, res)

后序遍历

# recursively
def inorderTraversal1(self, root):res = []self.helper(root, res)return resdef helper(self, root, res):if root:self.helper(root.left, res)self.helper(root.right, res)res.append(root.val)

【数据结构笔记】二叉搜索树及其相关算法相关推荐

  1. 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...

  2. 数据结构之二叉搜索树(BST)

    数据结构之二叉搜索树(BST) 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: ( ...

  3. 【数据结构】二叉搜索树的python实现

    [数据结构]二叉搜索树的python实现 二叉搜索树是以二叉树来组织的,对于一个二叉搜索树的节点,其左子树节点的元素值都不大于该节点元素值,其右子树节点的元素值都不小于该节点的元素值. 首先定义一个初 ...

  4. 请回答数据结构【二叉搜索树】

    请回答数据结构[二叉搜索树] 1. BinarySearchTree(二叉排序树) 1.0 Intro 1.1 concept 2. 二叉搜索树快速入门 2.1 查找 2.2 BSTree应用 3. ...

  5. 数据结构与算法 整理笔记---二叉搜索树

    二叉搜索树 查找问题是计算机中非常重要的基础问题 二分查找法 对于有序数组,才能使用二分查找法(排序作用) public class BinarySearch {public static int b ...

  6. l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...

  7. 2021-10-11 二叉树,二叉搜索树及其相关23个操作 C++实现笔记(复习用,含C指针复习)

    学数据结构到现在写的最久的一部分,简单总结一下这一周 1.考虑到未来考试要求,实现语言从java换成了C++,没想到意外的顺利 2.没别的了,干就完了 3.代码肯定有错误的地方,虽然我自认为是完美主义 ...

  8. 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树

    概念~ 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree), ...

  9. 数据结构:二叉搜索树(BST)的基本操作

    概述 学习过数据结构的童鞋都应该知道,对树的操作是一些最基本的技能(本文是对后面要写B树.B-树.B+树的一个前导,已经熟悉的朋友可以跳过了).而在树结构中,二叉树又是最基础的.虽然这些知识是比较基础 ...

  10. js遍历树节点下的所有子节点_「Javascript数据结构」× 二叉搜索树

    目录 树的相关术语 二叉树和二叉搜索树 二叉树的遍历 二叉搜索树的搜索 二叉搜索树的移除 「 树的相关术语 」 一个树结构包含一些列存在父子关系的节点.每个节点都有一个父节点(除了顶部的第一个节点)以 ...

最新文章

  1. [转]Android NDK几点回调方式
  2. 开发相关手册、STM32各种库文件、相关软件、工具连接等(不断更新)
  3. (笔记)Ubuntu下安装arm-linux-gcc-4.4.3.tar.gz (交叉编译环境)
  4. 《MySQL——幻读与next-key lock与间隙锁带来的死锁》
  5. JVM的进阶学习(GC Roots、JVM调优与参数配置、)
  6. Flex的动画效果与变换(1)
  7. 句句真研—每日长难句打卡Day14
  8. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-3.微信Oauth2.0交互流程讲解...
  9. 社区奖品之金士顿1G U盘
  10. java servlet的包下载_javax.servlet.jar下载
  11. 某学校买了一批计算机配置为,初中信息技术考试选择题
  12. 什么是DNS?为什么选择UDP?详细的DNS解析过程?
  13. FFmpeg —— 为视频添加文字水印(完美解决中文乱码,无需编译)
  14. 1.Python基础
  15. 一些有用的英语学习资料
  16. Proxmox Mail Gateway (PMG) 安装及简单设置
  17. C++设计模式——访问者模式
  18. 使用WIFI模块与MQTT服务器进行透传数据通讯(M0E1系列)
  19. 木棍游戏(深搜 模板
  20. 入职 3 天“窃取”上万个代码文件,特斯拉起诉前软件工程师!

热门文章

  1. PHP $_SERVER详解
  2. ubuntu开机自动关闭独显,使用集成显卡
  3. VS2015 scanf 函数报错 error C4996: 'scanf'
  4. jmeter 中的Parameters 和Body Data的区别
  5. 简述redux(1)
  6. php四种基础算法:冒泡,选择,插入和快速排序法PHP基础教程
  7. Cocos2d-x 学习之引擎介绍
  8. 捕获asp.net下的未处理异常
  9. Word插入公式中如何编辑 argmin
  10. 澜舟科技开源轻量级中文语言预训练模型——孟子模型