查找二叉树中符合特定条件的值

总结了一下基本用到的公式。

下面用数组存了下,循环求解了

/*
满二叉树:一棵深度为h,且有2的(h)次方-1个节点的二叉树
特点:每一层上的结点数都是最大结点数

它的叶子数是: 2^(h-1)
第k层的结点数是: 2^(h-1)
总结点数是: 2^h-1 (2的k次方减一)
总节点数一定是奇数。所以 2^h-1=127,得出h=7.叶子数为:2^(h-1)=2^(7-1)=64
--------------------------------------------------------------------------

用数组存,第i层的范围为2^(i-1)-1~~~~2^i-2
2^i=2<<(i-1)
2^i=1<<i;

查找特定节点:
1.节点的深入最小->递归深度,循环数组最小
2.节点为孩子节点->左右子树而空
3.节点位于最右侧 ->每层最右侧 

	1
 2    3
4  N  6   7
89 NN 1213 NN

*/
#include<iostream>
const int NIL=1<<10;

int main(){
	int A[]={1,2,3,4,NIL,6,7,8,9,NIL,NIL,12,13,NIL,NIL};
	int n=(sizeof(A)/sizeof(int)+1);
    int cnt=0;
	while(n!=1 && (n=n>>1)){//求解层数
	cnt++;
	}
	n=cnt;

	int l,r;
	for(int i=1;i<n;i++){  //0~n-1
		l=(2<<(i-1))-3,r=(2<<(i-1))-2; //每层边界
			//printf("%d %d\n",l,r);
		while(l>=0&&l<r){ //从右向左查找
		 int lc=r*2+1,rc=r*2+2;
		 if(A[lc]==NIL && A[rc]==NIL){
		 	printf("%d\n",A[r]);
		 	return 0;
		 }
		 r--;
 		}
	}
	return 0;
}
时间: 2024-08-26 08:11:44

查找二叉树中符合特定条件的值的相关文章

《Linux学习并不难》Linux常用操作命令(14):grep命令查找文件中符合条件的字符串

8.14  <Linux学习并不难>Linux常用操作命令(14):grep命令查找文件中符合条件的字符串 使用grep命令可以查找文件内符合条件的字符串.          命令语法: grep [选项] [查找模式] [文件] 命令中各选项的含义如表所示. 选项 选项含义 -E 模式是一个可扩展的正则表达式 -F 模式是一组由断行符分隔的定长字符串 -P 模式是一个Perl正则表达式 -b 在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量 -c 只显示匹配行的数量 -i 比较时不

exp导出一个表中符合查询条件的数据

原文地址:exp导出一个表中符合查询条件的数据 作者:charsi 导出一个表中的部分数据,使用QUERY参数,如下导出select * from test where object_id>50000这个条件中的数据exp charsi/[email protected] tables=(TEST) query="'where object_id>50000'" file=aaa.dmp log=aaa.log 其他参数含义:GRANTS:指定是否导出对象的授权信息,默认参

左神算法书籍《程序员代码面试指南》——3_08找到二叉树中符合搜索二又树条件的最大拓扑结构【***】

[题目]给定一棵二叉树的头节点head,已知所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小. [题解] 方法一:二叉树的节点数为N,时间复杂度为O(N2)的方法. 首先来看这样一个问题,以节点h为头的树中,在拓扑结构中也必须以h为头的情况下,怎么找到符合搜索二叉树条件的最大结构?这个问题有一种比较容易理解的解法,我们先考查h的孩子节点,根据孩子节点的值从h开始按照二叉搜索的方式移动,如果最后能移动到同一个孩子节点上,说明这个孩子节点可以作为这个拓扑的一部分,并继续考

C++中如何在顺序容器中删除符合特定条件的元素

以前很少做删除操作,vector一直当成数组用,而实际追求效率时又经常舍弃vector选用C风格数组.看<C++ Primer>到顺序容器删除这节时试着实现课后习题结果一动手我就出错了. 习题是将数组int ia[]拷贝到std::vector<int>中,并删除偶数元素. 先给出我的错误代码 int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 }; vector<int> v(begin(ia), end(ia)); fo

SqlSever基础 delete 删除符合特定条件的元素

y 镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 table code 1 use helloworld 2 select * from Teacher 2 table show 3 key code 1 --我准备删除燃灯古佛,这一项 2 delete from Teacher where Name='燃灯古佛' 4 key code

object - c 在URL中截取特定参数的值

#pragma mark - 获取url特定的参数 -(NSString *) jiexi:(NSString *)CS webaddress:(NSString *)webaddress { NSError *error; NSString *regTags=[[NSString alloc] initWithFormat:@"(^|&|\\?)+%@=+([^&]*)(&|$)",CS]; NSRegularExpression *regex = [NSRe

查找 二叉树中 k1 到 k2区间的节点

1 vector<int> res; 2 int key1, key2; 3 4 void traverse(TreeNode * root){//采用前序遍历 5 if(root == NULL) 6 return; 7 if(key1 <= root->val && key2 >= root->val)//满足条件的就存入 8 res.push_back(root->val); 9 traverse(root->left); 10 tra

python查询redmine中符合特定日期的issue

相关库 redminelib datetime 例子 #用于取得特定时间后更新的问题票,减少同步的时间 from redminelib import Redmine import datetime redmine = Redmine('redmine address', key='your key') now = datetime.datetime.now() update_time = now.strftime(">=%Y-%m-%dT%H:%M:%SZ") issues =

查找二叉树

[问题描述] 已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为x的结点,并指出是第几个结点.例:如图二叉树的数据文件的数据格式如下 7 15 5 2 3 12 4 5 10 0 0 29 0 0 15 6 7 8 0 0 23 0 0 •‘ 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 struct node 6 { 7 int parent;