二叉树操作
时间:2022-05-30
本文章向大家介绍二叉树操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
# coding:utf-8
import pygraphviz as pgv
# 类节点
class Node():
def __init__(self, x=-1,index = 0, r_child=None, l_child=None):
self.__x = x
self.index = index
self.l_child = l_child
self.r_child = r_child
def get(self):
return self.__x
def setx(self, x):
self.__x = x
# 树类
class Tree():
# 初始化一棵树
def __init__(self, node=None):
self.root = node
self.A = pgv.AGraph(directed=True, strict=True, rankdir='TR')
self.A.node_attr['shape'] = 'circle'
def add_node(self, node):
my_queue = []
if self.root is None:
self.root = node
return
temp_node = self.root
while temp_node:
if temp_node.l_child is None:
temp_node.l_child = node
return
if temp_node.r_child is None:
temp_node.r_child = node
return
my_queue.append(temp_node.l_child)
my_queue.append(temp_node.r_child)
temp_node = my_queue.pop(0)
def get_deep(self, total):
fac = 1
total = total+1
times = 0
while fac <= total:
fac = 2*fac
times = times + 1
return times
def create_by_preorder(self, capacity):
'''将capacity数组按照先序创建二叉树'''
length = len(capacity)
if length <= 0:
return None
'''计算可以创建树的深度-层数'''
deep_nums = self.get_deep(length)
self.root = Node(capacity[0])
if length == 1:
return
'''先在来根据二叉树来估算左右元素个数'''
'''计算最下层个数bottom_numers'''
temp = pow(2, (deep_nums-1))
bottom_numers = length - (temp-1)
left_numbers = 0
'''计算左右各占几个数'''
if bottom_numers >= temp/2:
left_numbers = temp-1
else:
left_numbers = temp-1 - (temp/2-bottom_numers)
left_capacity = capacity[1:(left_numbers+1)]
left_tree = Tree()
right_tree = Tree()
left_tree.create_by_preorder(left_capacity)
self.root.l_child = left_tree.root
right_capacity = capacity[(left_numbers+1):]
right_tree.create_by_preorder(right_capacity)
self.root.r_child = right_tree.root
def recur_preorder_trvalsal(self, root):
'''递归实现先序遍历'''
if root is None:
return
print root.get()
l, r = None, None
if root.l_child:
self.A.add_edge(root.get(), root.l_child.get())
l = root.l_child.get()
self.recur_preorder_trvalsal(root.l_child)
if root.r_child:
self.A.add_edge(root.get(), root.r_child.get())
r = root.r_child.get()
self.recur_preorder_trvalsal(root.r_child)
if root.l_child or root.r_child:
if not root.l_child:
l = str(root.get()) + '-'
self.A.add_node(l, style='invis')
self.A.add_edge(root.get(), l, style='invis')
if not root.r_child:
r = str(root.get()) + '+'
self.A.add_node(r, style='invis')
self.A.add_edge(root.get(), r, style='invis')
mid = str(root.get()) + ' '
self.A.add_node(mid, style='invis')
self.A.add_edge(root.get(), mid, style='invis')
B = self.A.add_subgraph([l, mid, r], rank='same')
B.add_edge(l, mid, style='invis')
B.add_edge(mid, r, style='invis')
def graph_tree(self):
self.A.layout('dot')
self.A.draw('tree.ps')
def stack_preorder_trvalsal(self, root):
'''堆栈实现先序遍历'''
stack = []
temp_node = root
num = 0
while temp_node or stack:
if temp_node:
num += 1
print temp_node.get()
stack.append(temp_node)
temp_node = temp_node.l_child
else:
temp_node = stack.pop()
temp_node = temp_node.r_child
return num
def recur_midorder_trvalsal(self, root):
'''递归实现中序遍历'''
if root is None:
return
self.recur_midorder_trvalsal(root.l_child)
print root.get()
self.recur_midorder_trvalsal(root.r_child)
def stack_midorder_trvalsal(self, root):
'''堆栈实现中序遍历'''
temp_node = root
my_stack = []
while temp_node or my_stack:
if temp_node:
my_stack.append(temp_node)
temp_node = temp_node.l_child
else:
temp_node = my_stack.pop()
print temp_node.get()
temp_node = temp_node.r_child
def recur_postorder_trvalsal(self, root):
'''递归实现后序遍历'''
if root is None:
return
self.recur_postorder_trvalsal(root.l_child)
self.recur_postorder_trvalsal(root.r_child)
print root.get()
def stack_postorder_trvalsal(self, root):
'''堆栈实现后序遍历'''
my_stack1 = []
my_stack2 = []
temp_node = root
while temp_node or my_stack1:
if temp_node:
my_stack2.append(temp_node)
my_stack1.append(temp_node)
temp_node = temp_node.r_child
else:
temp_node = my_stack1.pop()
temp_node = temp_node.l_child
while my_stack2:
print my_stack2.pop().get()
def queue_trvalsal(self, root):
temp_node = root
my_stack = []
while temp_node or my_stack:
if temp_node:
print temp_node.get()
if temp_node.l_child:
my_stack.append(temp_node.l_child)
if temp_node.r_child:
my_stack.append(temp_node.r_child)
if my_stack == []:
return
temp_node = my_stack.pop(0)
def create_preorder(self, deep_nums):
if self.root is None:
self.root = Node(0)
left_tree = Tree()
left_tree.root = Node(1)
left_tree.root.index = self.root.index + 1
if left_tree.root.index > deep_nums:
return
left_tree.create_preorder(deep_nums)
self.root.l_child = left_tree.root
right_tree = Tree()
right_tree.root = Node(0)
right_tree.root.index = self.root.index + 1
right_tree.create_preorder(deep_nums)
self.root.r_child = right_tree.root
def create_preorder1(self, root, deep_nums):
root.l_child = Node(1)
root.l_child.index = root.index+1
if root.l_child.index < deep_nums:
self.create_preorder1(root.l_child, deep_nums)
root.r_child = Node(0)
root.r_child.index = root.index+1
if root.r_child.index < deep_nums:
self.create_preorder1(root.r_child, deep_nums)
def test():
print 'test'
if __name__ == '__main__':
test()
print "sdfsdfsdfsd"
while 1:
print '1'
- 阻止a标签的默认事件及延伸
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
- 《JavaScript高级程序设计》学习笔记(4)——引用类型
- iOS项目——基本框架搭建
- iOS学习——键盘弹出遮挡输入框问题解决方案
- iOS项目——项目开发环境搭建
- im协议设计选型(上)
- iOS学习——UIAlertController详解
- iOS学习——获取iOS设备的各种信息
- iOS学习——属性引用self.xx与_xx的区别
- iOS学习——iOS 整体框架及类继承框架图
- iOS学习—— UINavigationController的返回按钮与侧滑返回手势的研究
- iOS学习——iOS常用的存储方式
- iOS学习——内存泄漏检查及原因分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 寻找和为定值的两个数
- 还不会命令行?用Go Flag自写命令行程序
- 【go】剑指offer:常见排序算法
- 剑指offer:重建一个二叉树
- Redis基础数据类型(string、hash、list)
- 【go】编程之法:01背包问题及滚动数组优化
- 【go】剑指offer:求一个数的整数次方
- 《编程珠玑》字符串包含
- redis基本数据类型(集合、HyperLogLog、地理位置)
- 【go】剑指offer:不同程序员遇到相同的题
- Spring全家桶之SpringSecurity
- Go实现字符串全排列字典序排列详解
- Go实现字符串全排列详解递归
- springboot整合RSA进行sign签名校验
- Go寻找最长回文字符串——中心扩展法