class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None class OperationTree:
def insert(self, root, val):
if root is None:
root = TreeNode(val) elif val < root.val:
root.left = self.insert(root.left, val)
elif val > root.val:
root.right = self.insert(root.right, val)
return root def printTree(self, root):
if root is None:
return
self.printTree(root.left)
print(root.val, end=' ')
self.printTree(root.right) def query(self, root):
if root is None:
return
if val == root.val:
return True
elif val < root.val:
self.query(root.left)
elif val > root.right:
self.query(root.right) def find_min(self, root):
if root.left:
return self.find_min(root.left)
else:
return root def find_max(self, root):
if root.right:
return self.find_max(root.right)
else:
return root def del_node(self, root, val):
if root is None:
return
if val < root.val:
root.left = self.del_node(root.left, val)
elif val > root.val:
root.right = self.del_node(root.right, val)
# 当val == root.val时,分为三种情况:只有左子树或者只有右子树、有左右子树、即无左子树又无右子树
else:
if root.left and root.right:
# 既有左子树又有右子树,则需找到右子树中最小值节点
temp = self.find_min(root.right)
root.val = temp.val
# 再把右子树中最小值节点删除,让它符合二叉搜索树的定义
root.right = self.del_node(root.right, temp.val)
elif root.right is None and root.left is None:
# 左右子树都为空
root = None
elif root.right is None:
# 只有左子树
root = root.left
elif root.left is None:
# 只有右子树
root = root.right
return root if __name__ == '__main__':
List = [17, 5, 35, 2, 11, 29, 38, 9, 16, 8]
root = None
op = OperationTree()
for val in List:
root = op.insert(root, val)
print('中序打印二叉搜索树:', end=' ')
op.printTree(root)

  

python 二叉搜索树相关代码的更多相关文章

  1. 二叉搜索树 C++代码实现

    暂未发现什么bug,如果发现请指出. #include<iostream> using namespace std; //定义二叉搜索树的结点 struct Node { int data ...

  2. BST(二叉搜索树)相关

    1.BST的合法性:validate-binary-search-tree class TreeNode { int val; TreeNode left; TreeNode right; TreeN ...

  3. 二叉搜索树(Binary Search Tree)--C语言描述(转)

    图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩子(当然了,存在的话)的值总是小于本身,而右孩子(存在的话)的值总 ...

  4. 二叉搜索树Java实现(查找、插入、删除、遍历)

    由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...

  5. 基于visual Studio2013解决算法导论之029二叉搜索树

     题目 二叉搜索树 解决代码及点评 #include <stdio.h> #include <malloc.h> #include <stdlib.h> ty ...

  6. 6.1 集合和映射--集合Set->底层基于二叉搜索树实现

    前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可.在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的集合(set)这种数据结构.集合set的 ...

  7. 自己动手实现java数据结构(六)二叉搜索树

    1.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...

  8. 数据结构 - 二叉搜索树封装 C++

    二叉搜索树封装代码 #pragma once #include <iostream> using namespace std; template<class T>class T ...

  9. 每日一题 - 剑指 Offer 33. 二叉搜索树的后序遍历序列

    题目信息 时间: 2019-06-26 题目链接:Leetcode tag:分治算法 递归 难易程度:中等 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 tr ...

随机推荐

  1. .NET Core 3.0 发布单文件可执行程序

    Windows dotnet publish -r win10-x64 /p:PublishSingleFile=true maxOS dotnet publish -r osx-x64 /p:Pub ...

  2. oracle导入时IMP-00010: 不是有效的导出文件, 头部验证失败

    头部验证失败是由于版本号不同所致,经试验可以通过如下方法进行修改:用notepad++工具打开dmp文件,可以看到头部信息 --TEXPORT:V11.01.00,即为源数据库的版本号,将其修改为目的 ...

  3. shell script 编程入门

    参考 <linux shell scripting cookbook> 控制台输出 结构化输出 #!/bin/bash #Filename: printf.sh printf " ...

  4. TensorFlow C++接口编译和使用

    部分内容from: Tensorflow C++ 从训练到部署(1):环境搭建 在之前的编译中,已经编译好了tensorflow_pkg相关的wheel.现在有一个需求,需要按照C++的代码进行模型加 ...

  5. linux程序对比

  6. 前端基础(十):Bootstrap Switch 选择框开关控制

    简介 Bootstrap Switch是一款轻量级插件,可以给选择框设置类似于开关的样式 它是依赖于Bootstrap的一款插件 下载 下载地址 在线引用 导入 因为它是依赖于Bootstrap的一款 ...

  7. Hadoop_18_MapRduce 内部的shuffle机制

    1.Mapreduce的shuffle机制: Mapreduce中,map阶段处理的数据如何传递给Reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle 将mapta ...

  8. MongoDB安全运维

    0×00 MongoDB权限介绍 1.MongoDB安装时不添加任何参数,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库,需以–auth参数启动. 2.在刚安装完毕的时候M ...

  9. 一图一知-TS之Interface接口

  10. 【转】GO语言map类型interface{}转换踩坑小记

    原文:https://www.az1314.cn/art/69 ------------------------------------------ mapA := make([string]inte ...