树的 起步*------二叉树

A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each
time the ball being dropped first visits a non-terminal node. It then keeps moving down, either follows
the path of the left subtree, or follows the path of the right subtree, until it stops at one of the leaf
nodes of FBT. To determine a ball’s moving direction a flag is set up in every non-terminal node with
two values, either false or true. Initially, all of the flags are false. When visiting a non-terminal node
if the flag’s current value at this node is false, then the ball will first switch this flag’s value, i.e., from
the false to the true, and then follow the left subtree of this node to keep moving down. Otherwise,
it will also switch this flag’s value, i.e., from the true to the false, but will follow the right subtree of
this node to keep moving down. Furthermore, all nodes of FBT are sequentially numbered, starting at
1 with nodes on depth 1, and then those on depth 2, and so on. Nodes on any depth are numbered
from left to right.
For example, Fig. 1 represents a fully binary tree of maximum depth 4 with the node numbers 1,
2, 3, ..., 15. Since all of the flags are initially set to be false, the first ball being dropped will switch
flag’s values at node 1, node 2, and node 4 before it finally stops at position 8. The second ball being
dropped will switch flag’s values at node 1, node 3, and node 6, and stop at position 12. Obviously,
the third ball being dropped will switch flag’s values at node 1, node 2, and node 5 before it stops at
position 10.
Fig. 1: An example of FBT with the maximum depth 4 and sequential node numbers.
Now consider a number of test cases where two values will be given for each test. The first value is
D, the maximum depth of FBT, and the second one is I, the I-th ball being dropped. You may assume
the value of I will not exceed the total number of leaf nodes for the given FBT.
Please write a program to determine the stop position P for each test case.
For each test cases the range of two parameters D and I is as below:
2 ≤ D ≤ 20, and 1 ≤ I ≤ 524288.
Input
Contains l + 2 lines.
Line 1 l the number of test cases
Line 2 D1 I1 test case #1, two decimal numbers that are separated by one blank
...
Line k + 1 Dk Ik test case #k
Line l + 1 Dl Il test case #l
Line l + 2 -1 a constant ‘-1’ representing the end of the input file
Output
Contains l lines.
Line 1 the stop position P for the test case #1
...
Line k the stop position P for the test case #k
...
Line l the stop position P for the test case #l
Sample Input
5
4 2
3 4
10 1
2 2
8 128
-1
Sample Output
12
7
512
3
255

给你一个完全二叉树 其深度为D  从上到下 从左到右的  叶子 分别 编号为   1  -  (2^D) -1        每个叶子上  都有一个开关  起始的时候   开关都是 关闭的      当开关关闭的 时候   小球都是 向 该节点的 左儿子 走去开关开启的  时候 相反

现在 给你 树的深度 D  和  小球的  个数   I  问你   最后 一个 小球  落在了 那个  叶子节点上 .

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxd=20 ;
 4 int s[1<<maxd];
 5 int main()
 6 {
 7     int D,I;
 8     while(scanf("%d%d",&D,&I)==2)
 9     {
10         memset(s,0,sizeof(s));             //  表示 开关的 状态 .
11         int k,n=(1<<D)-1;        //  编号最大的 叶子
12         for(int i=1;i<=I;i++)
13         {
14             k=1;
15             for(;;)
16             {
17                 s[k]=!s[k];
18                 k=s[k]?2*k:k*2+1;
19                 if(k>n)
20                     break;
21             }
22         }
23         printf("%d",k/2);
24     }
25     return 0;
26 }
时间: 2025-01-05 00:22:07

树的 起步*------二叉树的相关文章

找树节点在二叉树中的深度

/* *pRoot接收要检索的树的根节点,pNode是要确认深度的结点 path存储从根结点到pNode的所有节点,包括了pNode和根节点 */ void findPath(BinaryTreeNode *pRoot, BinaryTreeNode *pNode, vector<int> &path){ if (pRoot == NULL) return; path.push_back(pRoot->m_nValue); if (pRoot == pNode){ //找到了节点

POJ 3437 Tree Grafting(有序树转化为二叉树)

Tree Grafting Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1834   Accepted: 795 Description Trees have many applications in computer science. Perhaps the most commonly used trees are rooted binary trees, but there are other types of r

树/森林和二叉树的转换

树转二叉树 左儿子右兄弟,即第一个儿子是左二子,第一个兄弟是右儿子,然后按层次按顺序调整每一个即可. 规范做法是三步: 加线: 同一层的兄弟按顺序加线. 去线: 保留第一个儿子,其他儿子连线删掉. 调整层次. 森林转二叉树 先将每个树转成二叉树,然后从第二棵开始,把每一棵二叉树的根都作为前一棵的右儿子. 二叉树转树 根据树转二叉树,考虑逆过程,如果一个节点有左儿子,那么这个左二子的右儿子,右儿子的右儿子,...都是该节点的兄弟节点. 规范做法也是三步: 加线: 左儿子的右儿子,左儿子的右儿子的右

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层

【树2】二叉树

二叉树简介 ---------------------------注:本文所用的术语定义均来自国外大学和计算机文献使用的定义,非国内教材.------------------------------ 二叉树也是一种树,它特殊在: 1.每个结点的孩子最多只能是2,即二叉树中不存在度大于2的结点. 2.每个结点的孩子结点区分左孩子和又孩子,即便是只有1个孩子结点,也分左孩子和右孩子. 注意: 1.二叉树是 rooted tree.即二叉树必须指定,且固定有一个唯一的root结点.这话听起来很奇怪:只

(树)判断二叉树是否为BST

题目:判断一颗二叉树是否为BST. 思路:其实这个问题可以有多个解决方法. 方法一:递归解决.根据BST的特性.左边的小于根节点的值,右边的大于根节点的值.并且对于每一棵子树都是如此.所以我们可以直接递归的对左右子树的值与根节点的值进行比较.左子树的值小于当前根节点的值,将当前根节点的值作为最大值传入左子树,左子树的值都小于他,递归处理:右子树的值都大于根节点的值,将根节点的值作为最小值传入右子树,右子树的值都大于他. 代码: /** * Definition for binary tree *

树 森林与二叉树的转换

1.树.森林为什么向二叉树转换? 因为在实际的处理问题中,大多数情况都是一对多,就向树.森林这样的数据结构! 而对于二叉树我们已经很熟悉了,所以转向我们所熟悉的结构,好处理. 2.孩子兄弟树的方法 把握左孩子右兄弟的原则: (1).树与二叉树的转换:i>以树的根结点为二叉树的根节点: ii>左孩子指针指向该根节点的第一个子结点: iii>右孩子指针指向"兄弟结点" (2).二叉树表示森林:i>二叉树的根结点是森林中第一棵树的根结点 ii>根结点的右孩子为森

Python与数据结构[3] -&gt; 树/Tree[0] -&gt; 二叉树及遍历二叉树的 Python 实现

二叉树 / Binary Tree 二叉树是树结构的一种,但二叉树的每一个节点都最多只能有两个子节点. Binary Tree: 00 |_____ | | 00 00 |__ |__ | | | | 00 00 00 00 对于二叉树的遍历,主要有以下三种基本遍历方式: 先序遍历:先显示节点值,再显示左子树和右子树 中序遍历:先显示左子树,再显示节点值和右子树 后序遍历:先显示左子树和右子树,再显示节点值 下面将用代码构建一个二叉树,并实现三种遍历方式, 完整代码 1 class TreeNo

【剑指offer】【树】27.二叉树的镜像

二叉树的镜像 递归法 递归的先序遍历二叉树,交换每个节点的左右子节点,即可生成二叉树的镜像 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNod