python 二叉树实现
二叉树实现思想
1、把每个节点都看作是一个对象包含以下特征:
节点的当前值
节点的左孩子(存储比当前节点值小的节点对象)
节点右孩子(存储比当前节点值大的节点对象)
2、二叉树就是以根节点开始的连续的对象串
代码实现:
# -*- coding:utf-8 -*-
# 日期:2018/6/12 8:09
# Author:小鼠标 # 节点对象
class Node:
def __init__(self):
self.left_children = None
self.right_children = None
self.value = None # 二叉树对象
class tree:
def __init__(self):
self.root = False
self.front_list = []
self.middle_list = []
self.after_list = []
# 生成二叉树
def create_tree(self,n=0,l=[]):
if l == []:
print("传入的列表为空")
return
if n > len(l)-1:
print("二叉树生成")
return
node = Node()
node.value = l[n]
if not self.root:
self.root = node
self.list = l
else:
self.add(self.root,node)
self.create_tree(n+1,l)
# 添加节点
def add(self,parent,new_node):
if new_node.value > parent.value:
# 插入值比父亲值大,所以在父节点右边
if parent.right_children == None:
parent.right_children = new_node
else:
self.add(parent.right_children,new_node)
else:
# 插入值比父亲值小,所以在父节点左边
if parent.left_children == None:
parent.left_children = new_node
else:
self.add(parent.left_children,new_node)
# 前序(先中再左最后右)
def front(self,node=None):
if node == None:
node = self.root
# 输出当前节点
self.front_list.append(node.value)
# 先判断左枝
if not node.left_children == None:
self.front(node.left_children)
# 再判断右枝
if not node.right_children == None:
self.front(node.right_children)
# 返回最终结果
return self.front_list
# 中序(先左再中最后右)
def middle(self,node=None):
if node == None:
node = self.root
# 先判断左枝
if not node.left_children == None:
self.middle(node.left_children)
# 输出当前节点
self.middle_list.append(node.value)
# 再判断右枝
if not node.right_children == None:
self.middle(node.right_children)
return self.middle_list
# 后序(先左再右最后中)
def after(self,node=None):
if node == None:
node = self.root
# 先判断左枝
if not node.left_children == None:
self.after(node.left_children)
# 再判断右枝
if not node.right_children == None:
self.after(node.right_children)
self.after_list.append(node.value)
return self.after_list # 搜索
def search(self,v,node=None):
if node == None:
node = self.root
if node.value == v:
return True
if v > node.value:
if not node.right_children == None:
return self.search(v, node.right_children)
else:
if not node.left_children == None:
return self.search(v, node.left_children)
return False
if __name__ == '__main__':
# 需要建立二叉树的列表
list = [4, 6, 3, 1, 7, 9, 8, 5, 2]
t = tree()
t.create_tree(0,list)
res = t.front()
print('前序',res)
res = t.middle()
print('中序',res)
res = t.after()
print('后序',res)
i = t.search(8)
print('8是否在二叉树中',i)
中心就是递归判断传值,递归取值,很简单,下一步就是优化二叉树,二叉树的左旋,右旋,实现平衡二叉树。
python 二叉树实现的更多相关文章
- Python --- 二叉树的层序建立与三种遍历
二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有....(此处省略好多字)....等的优良特点. 之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结 ...
- Python - 二叉树, 堆, headq 模块
二叉树 概念 二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树), 或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树组成. 特点 每个结点最多有两颗子树,所 ...
- python 二叉树实现带括号的四则运算(自学的孩子好可怜,不对的地方请轻责)
#!/usr/bin/python #* encoding=utf-8 s = "20-5*(0+1)*5^(6-2^2)" c = 0 top = [0,s[c],0] op = ...
- python二叉树递归算法之后序遍历,前序遍历,中序遍历
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2016-11-18 08:53:45 # @Author : why_not_try ...
- python 二叉树实现带括号的四则运算
#!/usr/bin/python #* encoding=utf-8 s = "20-5*(0+1)*5^(6-2^2)" c = 0 top = [0,s[c],0] op = ...
- python二叉树简单实现
二叉树简单实现: class Node: def __init__(self,item): self.item = item self.child1 = None self.child2 = None ...
- python二叉树染色-有严重BUG
#coding:utf-8 ''' 二叉树涂黑 输入: 5 2 1 -1 4 2 -1 5 4 -1 3 1 1 2 输出: 3 第二题是:斗地主 ''' import sys b=list() cl ...
- python 二叉树计算器
例子:计算1+2+3+4的值 代码: class Buffer(object): """字符串处理函数""" def __init__(se ...
- python二叉树的遍历,递归和非递归及相关其它
# encoding=utf-8class node(object): def __init__(self,data,left=None,right=None): self.data = data s ...
随机推荐
- HtmlUnit学习总结
HtmlUnit学习总结 转载 2016年09月13日 15:58:25 标签: htmlunit / 爬虫 7304 本文摘抄其他博客或者技术论坛,自己搜集整理如下: HtmlUnit学习总结 摘要 ...
- CSS 字体交互特效
一.鼠标悬浮时,字体颜色从左到右依次变化<!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- sql注入-推断是否存在SQL注入-单引号
来自:https://www.cnblogs.com/ichunqiu/p/5749347.html 首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个: GET请求:该请求在URL中发送参 ...
- C#编程时应注意的性能处理
GC堆回收 那么除了通过new对象而达到代的阈(临界)值时,还有什么能够导致垃圾堆进行垃圾回收呢? 还可能windows报告内存不足.CLR卸载AppDomain.CLR关闭等其它特殊情况. 或者,我 ...
- 浏览器输入url回车后,会发生什么?
通常我们想访问某一个网址,我们会在浏览器中输入它的域名,然后点击回车进行跳转,这样就可以进到网站的主页,看似简单的两步,其实背后都需要大量的代码在运行,支持,才能完成!那浏览器到底都做了哪些事呢? 一 ...
- 【C#】stream图像转byte的问题
Image xx = Image.FromStream(linkList[ii].stream); byte[] bytes = new Byte[linkList[ii].stream.Length ...
- 详解java定时任务---Timer篇
一.简介 在java的jdk中提供了Timer.TimerTask两个类来做定时任务. Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子 ...
- 微信小程序自运营器 微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营)
自动发单,自动评价,自动评论,自动推广 微信小程序自运营器 微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营) 我们会根据你的微信公众号或微信小程序定制开发带有一定AI智 ...
- JS将/Date(1446704778000)/转换成str
JS将/Date(1446704778000)/转换成str:var dateStr = eval(ele.add_time.replace(/\/Date\((\d+)\)\//gi, " ...
- MySQL 5.7版本 sql_mode=only_full_group_by 问题
具体错误: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in ...