二叉树

  节点定义

 class Node(object):
def __init__(self, item):
self.item = item
self.left = None
self.right = None

  二叉树定义

 class Tree(object):
def __init__(self):
self.root = None def add(self, item):
node = Node(item)
# 空树直接插入
if self.root == None:
self.root = node else:
cur_list = [self.root]
while True:
# 定义一个列表存储当前遍历节点
cur_node = cur_list.pop(0) # 当前节点左孩子为空直接插入,否则将该左孩子追加到遍历列表,以便当前节点右孩子也为非空时继续遍历下一层
if cur_node.left == None:
cur_node.left = node
break
else:
cur_list.append(cur_node.left)
# 当前节点右孩子为空直接插入,否则将该右孩子追加到遍历列表,以便继续遍历下一层
if cur_node.right == None:
cur_node.right = node
break
else:
cur_list.append(cur_node.right) # 广度遍历
def travel(self):
if not self.root:
print(None)
return None
q = [self.root]
while q:
cur_node = q.pop(0)
print(cur_node.item)
if cur_node.left:
q.append(cur_node.left)
if cur_node.right:
q.append(cur_node.right) # 深度遍历----前序遍历DLR
def dlr(self, node):
if node == None:
return
print(node.item)
self.dlr(node.left)
self.dlr(node.right) # 深度遍历----中序遍历LDR
def ldr(self, node):
if node == None:
return
self.ldr(node.left)
print(node.item)
self.ldr(node.right) # 深度遍历----后序遍历LRD
def lrd(self, node):
if node == None:
return
self.lrd(node.left)
self.lrd(node.right)
print(node.item)

  二叉树使用  

 tree = Tree()
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
print("----广度遍历----")
tree.travel()
print("----深度遍历:DLR----")
tree.dlr(tree.root)
print("----深度遍历:LDR----")
tree.ldr(tree.root)
print("----深度遍历:LRD----")
tree.lrd(tree.root)

二叉树使用

排序二叉树

  节点定义

 class Node(object):
def __init__(self, item):
self.item = item
self.left = None
self.right = None

  排序二叉树定义

 class SortTree(object):
def __init__(self):
self.root = None def insert(self, item):
node = Node(item)
cur_node = self.root
if not self.root:
self.root = node
else:
while True:
if node.item < cur_node.item:
if cur_node.left == None:
cur_node.left=node
break
else:
cur_node=cur_node.left
else:
if cur_node.right == None:
cur_node.right=node
break
else:
cur_node=cur_node.right # 广度遍历
def travel(self):
if not self.root:
print(None)
return None
q = [self.root]
while q:
cur_node = q.pop(0)
print(cur_node.item)
if cur_node.left:
q.append(cur_node.left)
if cur_node.right:
q.append(cur_node.right) # 深度遍历----前序遍历DLR
def dlr(self, node):
if node == None:
return
print(node.item)
self.dlr(node.left)
self.dlr(node.right) # 深度遍历----中序遍历LDR
def ldr(self, node):
if node == None:
return
self.ldr(node.left)
print(node.item)
self.ldr(node.right) # 深度遍历----后序遍历LRD
def lrd(self, node):
if node == None:
return
self.lrd(node.left)
self.lrd(node.right)
print(node.item)

  排序二叉树使用  

 tree=SortTree()
tree.insert(1)
tree.insert(30)
tree.insert(8)
tree.insert(20)
tree.ldr(tree.root)

排序二叉树使用

数据结构----二叉树Tree和排序二叉树的更多相关文章

  1. 【C#数据结构系列】树和二叉树

    线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都 ...

  2. "排序二叉树"之探幽

    /*怎么理解排序二叉树呢?在二叉树的基本定义上增加两个基本条件: (1)所有左子树的节点数值都小于此节点的数值: (2)所有右节点的数值都大于此节点的数值. */ 1 /*************** ...

  3. c++(排序二叉树)

    前面我们讲过双向链表的数据结构.每一个循环节点有两个指针,一个指向前面一个节点,一个指向后继节点,这样所有的节点像一颗颗珍珠一样被一根线穿在了一起.然而今天我们讨论的数据结构却有一点不同,它有三个节点 ...

  4. Java编程的逻辑 (42) - 排序二叉树

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  5. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  6. javascript/js实现 排序二叉树数据结构 学习随笔

    二叉树是一种数据结构.其特点是: 1.由一系列节点组成,具有层级结构.每个节点的特性包含有节点值.关系指针.节点之间存在对应关系. 2.树中存在一个没有父节点的节点,叫做根节点.树的末尾存在一系列没有 ...

  7. 【数据结构&算法】11-树基础&二叉树遍历

    目录 前言 树的定义 树的存储结构 双亲表示法 孩子表示法 孩子兄弟表示法 二叉树 定义 特点 形态 特殊二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 二叉树的顺序存储结构 二叉 ...

  8. c++(排序二叉树线索化)

    前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作.二叉树插入.二叉树删除1.删除2.删除3.但是排序二叉树也不是没有缺点,比如说,如果我们想在排序二叉树中删除一段数据的节点怎么 ...

  9. LeetCode:145_Binary Tree Postorder Traversal | 二叉树后序遍历 | Hard

    题目:Binary Tree Postorder Traversal 二叉树的后序遍历,题目要求是采用非递归的方式,这个在上数据结构的课时已经很清楚了,二叉树的非递归遍历不管采用何种方式,都需要用到栈 ...

随机推荐

  1. Imagelab-0-QT label显示 opencv 图像

    Imagelab-0-QT label显示 opencv 图像 opencvc++qtimagelab 开始之前 这其实也是opencv 处理图像的系列, 只是想我们在进一步复杂化我们的代码之前, 每 ...

  2. 【DNS域名解析命令】 dig

    dig - DNS lookup utility dig 命令主要用来从 DNS 域名服务器查询主机地址信息. Dig (domain information groper 域名信息搜索)是一个灵活的 ...

  3. 【Linux网络基础】TCP/IP协议簇的详细介绍(三次握手四次断开,11种状态)

    一.TCP/IP协议簇(DoD参考模型) 用于简化OSI层次,以及相关的标准. 传输控制协议(tcp/ip)簇是相关国防部DoD所创建的,主要用来确保数据的完整性以及在毁灭性战争中维持通信 是由一组不 ...

  4. SQL语句学习(二)

    为一张表添加外键: 这里我们希望再建一张订单的表为t_order,包含order_id,customer_id和price: ) NOT NULL auto_increment PRIMARY KEY ...

  5. JS中switch语句做选择时为什么可以不用break?

    在JavaScript中,switch语句相比其他语言并没有特殊之处. 在使用时,我们要注意每个分支后都应加一条break语句,否则后面的分支仍然会执行.实际程序中,我发现有时没用break语句,仍然 ...

  6. badboy 录制脚本

    第一步:介绍badboy工具 1.1: 页面功能分析: 1. 界面视图,模拟浏览器,能够进行操作 2. 需要录制脚本的URL 3. 点击运行URL 4. Summary:运行的各指标,响应时间,成功事 ...

  7. postman(介绍)

    Postman 界面介绍 一. 安装后首次打开 postman,会提示你是否需要登录,登录的话可以云端保存你的收藏及历史记录,不登陆不影响使用.   二. 进入后就是如下图所示的界面了.看到这么多按钮 ...

  8. Scrapy爬虫快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  9. 服务器安装JDK

    1.卸载OpenJDK, 安装OracleJDK a.一般的LINUX发行版内置OpenJDK, 相当于JDK的开源版本(我们平时使用的JDK特指OracleJDK) b.OpenJDK 不能使用ja ...

  10. Java实现通过反射获取指定类的所有信息

    package com.ljy; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.l ...