九度 1113 关于二叉树节点的个数问题

#include <stdio.h>
#include <math.h>

int main()
{
        int n,m,left,right;
        int count;
        int deep_n,deep_m,deep_diff;
        int i, j;

        for( scanf("%d%d",&m,&n); n!=0 && m!=0; scanf("%d%d",&m,&n) )
        {
                count = 0;
                left = right = m;

                deep_n = (int)(log(n)/log(2)+1); //节点n的深度
                deep_m = (int)(log(m)/log(2)+1); //节点m的深度

                deep_diff = deep_n - deep_m;     //两者的深度之差

				//其实可以将m节点看成一个独立的子树的根节点,就能理解此处所想表达的意思了
				//深度为deep的二叉树的节点个数为2^deep-1个,这样会好理解一点
                count += (int)pow(2,deep_diff) - 1;  

                for(i=1;i<=deep_diff;++i)
                {
                        left = 2*left;
                        right = 2*right+1;
                }

                if(right<=n)
                        count += right - left + 1;
                else if(left<=n)
                        count += n - left + 1;

                printf("%d\n",count);
        }
    return 0;
}

九度 1113 关于二叉树节点的个数问题,布布扣,bubuko.com

时间: 2024-12-26 04:32:38

九度 1113 关于二叉树节点的个数问题的相关文章

九度OJ 1078 二叉树遍历

题目1078:二叉树遍历 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2649 解决:1599 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根. 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历). 输入: 两个字符串,其长度

九度oj 1521 二叉树的镜像

原题链接:http://ac.jobdu.com/problem.php?pid=1521 水题,如下.. 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<vector> 7 using std::cin; 8 using std::swap; 9 using

九度OJ 1371 最小的K个数

#include<stdlib.h> #include<stdio.h> #include<queue> using namespace std; int main(){ int k,n; while(~scanf("%d%d",&n,&k)) { priority_queue<int,vector<int>,greater<int> >q; int t; for(int i=0;i<n;++

九度oj 1541 二叉树

原题链接:http://ac.jobdu.com/problem.php?pid=1541 无力吐槽了,c语言中全局变量初始值不是0(指针就是空指针)么? 就这点害我re的快吐啦/(ㄒoㄒ)/~~... 题意没啥好说的,套splay tree做.具体如下: #include<stdio.h> #include<stdlib.h> #include<string.h> #define Max_N 1100 #define size(_) ((_)==null ? 0 :

九度1078(二叉树已知先序和中序求后序)

题目链接:点击打开链接 解题思路: 很不错的一道题.用递归的方法求解.每次对两个序列进行递归,求得左子树的先序/中序,右子树的先序/中序.把树建好后调用递归输出后序即可 完整代码: #include <iostream> #include <cstdio> #include <string> using namespace std; string fir , mid; typedef struct Node { char ch; struct Node *l; stru

剑指OFFER之二叉树的镜像(九度OJ1521)

题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩子,紧接着是右孩子的编号.C

九度oj题目1521:二叉树的镜像

题目1521:二叉树的镜像 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2061 解决:560 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci=’l’表

九度OJ&amp;北邮机试题(2010计算机)

题目一.九度OJ-1169:比较奇偶数个数 http://ac.jobdu.com/problem.php?pid=1169 题目描述: 第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES. 输入: 输入有多组数据. 每组输入n,然后输入n个整数(1<=n<=1000). 输出: 如果偶数比奇数多,输出NO,否则输出YES. 样例输入: 5 1 5 2 4 3 样例输出: YES 直接来代码: AC代码: /** *@xiaoran */ #inc

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩