python实现满二叉树递归循环

一、二叉树介绍点这片文章

二叉树及题目介绍

例题:
有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,
小球每次经过开关就会把它的状态置反,这个开关为关时,小球左跑,为开时右跑。现在问第k个球下落到d层时的开关编号。输入深度d和小球个数k

思路分析:首先该题最先想到的是模拟,开一个数组表示开关,下标表示编号,根据k的子树为2k和2k+1来改变数组,判断进行。但是这样太麻烦了。而且根据深度和小球个数,导致计算量太大。
寻找规律:

可以知道每一层,第奇数个落入该层的球都是往左,第偶数个落入该层的球都是往右。
小球按照编号依次下落的,对于左枝(也就是奇数球),每个I号小球落入该层都是第(k+1)/2个小球。而偶数是往右走的k/2个小球
所以采取每一次一个循环,来判断k%2小球往哪儿走,循环d层,即可找出最后叶子!省去大数组和大时间

pytho实现

def bin_tree(x,floor):
    num = x
    location = 1  #设定初始位置第一层第一个
    for f in range(1, floor):
        if num%2: #只要是基数就往左边走
            num = (num + 1)/2 #每个位置会经过的小球重新编号
            location = 2*location  #左边的就是location的2倍
        else:
            num = num/2
            location = 2*location + 1  #右边为location 2倍?1
        print(location)

bin_tree(5, 6)

#结果为

2
4
9
18
36

原文地址:https://www.cnblogs.com/shiqi17/p/9483753.html

时间: 2024-10-28 21:58:51

python实现满二叉树递归循环的相关文章

数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)

前言:前面了解了树的概念和基本的存储结构类型及树的分类,而在树中应用最广泛的种类是二叉树 一.简介 在树型结构中,如果每个父节点只有两个子节点,那么这样的树被称为二叉树(Binary tree).其中,一个父结点的两个字节点分别叫做“左子节点”和“右子节点”.不过也不是所有父节点都有两个子节点,只有左子节点或者只有右子节点的情况也存在.另外,也会存在叶子结点,也就是一个子节点都没有的节点,唯一的限制就是每一个节点的子节点不能超过两个. 之前谈过的单向链表,是一种通过“指向下一个元素的指针”来连接

Python中的二叉树查找算法模块

问题 思路说明 二叉树查找算法,在开发实践中,会经常用到.按照惯例,对于这么一个常用的东西,Python一定会提供轮子的.是的,python就是这样,一定会让开发者省心,降低开发者的工作压力. python中的二叉树模块内容: BinaryTree:非平衡二叉树 AVLTree:平衡的AVL树 RBTree:平衡的红黑树 以上是用python写的,相面的模块是用c写的,并且可以做为Cython的包. FastBinaryTree FastAVLTree FastRBTree 特别需要说明的是:树

满二叉树的最近公共祖先

满二叉树节点父子之间的关系. //题目描述 // //有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1.现在有两个结点a,b. //请设计一个算法,求出a和b点的最近公共祖先的编号. //给定两个int a, b.为给定结点的编号.请返回a和b的最近公共祖先的编号.注意这里结点本身也可认为是其祖先. //测试样例: //2,3 //返回:1 //思路:满二叉树的子节点与父节点之间的关系为root = child / 2 //利用这个关系,如果a != b,就让其中

二叉树、平衡二叉树、完全二叉树、满二叉树 .

基本概念 结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层. 二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度. 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的(i

完全二叉树 满二叉树

概念 结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层. 二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度. 数据结构中,树的度是什么?  它是树内各结点的度的最大值. 为何节点的度? 结点拥有的子树数称为结点的度. 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆.二叉树的每个结点至多

代码赏析——满二叉树

/* 标题:锦标赛 如果要在n个数据中挑选出第一大和第二大的数据 (要求输出数据所在位置和值) 使用什么方法比较的次数最少? 我们可以从体育锦标赛中受到启发. 8个选手的锦标赛,先两两捉对比拼,淘汰一半. 优胜者再两两比拼...直到决出第一名. 第一名输出后,只要对黄色标示的位置重新比赛即可. 下面的代码实现了这个算法(假设数据中没有相同值). 代码中需要用一个数组来表示图中的树 (注意,这是个满二叉树,不足需要补齐). 它不是存储数据本身,而是存储了数据的下标. 第一个数据输出后,它所在的位置

完全二叉树、理想二叉树满二叉树

完全二叉树(Complete Binary Tree): 设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树. 理想二叉树(Perfect Binary Tree): 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的树称为理想二叉树.高度为h(从0开始算起)且包含2^(h+1)-1个节点的 二叉树是理想二叉树. 满二叉树(Full Binary Tree): 在国内实际上指的是上面提到的理想二叉树

linux shell for循环解决递归循环目录结构

今天总结一下关于linux shell里的递归循环的问题起因是一个群友在群里的提问问的是怎么把有或多或少空目录的几个文件移动走的问题归根结底就是一个递归循环的问题 如果之前接触过c语言之类的编程语言.那么这个很好理解就是通过函数来不断的自己调用自己这种方法有一个很大的弊端就是需要很多资源比如有一种进程调用的 fork 炸弹 就是自调用搞的 接下来我就贴一下代码然后简单的讲解一下 #!/bin/sh . /etc/plus.lib a() {     for file  in `ls $1`   

Python实现打印二叉树某一层的所有节点

不多说,直接贴程序,如下所示 # -*- coding: utf-8 -*- # 定义二叉树节点类 class TreeNode(object): def __init__(self,data=0,left=0,right=0): self.data = data self.left = left self.right = right # 遍历某一层所有节点,并打印 def TransLevel(root,level): if root == None: return else: if leve