【BST】判断节点r和s是不是一个为祖先,另一个为后代

题目:EPI

书上的代码我认为有错。我的代码如下所示,时间复杂度为O(h),h为二叉树的高度。

//该函数不允许r和s为nullptr,且要求r、m、s三个指针互不相等
bool is_r_s_descendant_and_ancestor(shared_ptr<treenode> r, shared_ptr<treenode> m, shared_ptr<treenode> s)
{
	if (m == nullptr || r == nullptr || s == nullptr)
		return false;
	shared_ptr<treenode> cur_r = r, cur_s = s, cur_m = m;
	bool is_r = false, is_s = false;//is_r代表着m是不是r的后代,<span style="font-family: Arial, Helvetica, sans-serif;">is_s代表着m是不是s的后代</span>

	//从r和s开始,同时向下寻找m
	while (cur_r && cur_s)
	{
		if (cur_r == m)
		{
			is_r = true;
			break;
		}
		if (cur_s == m)
		{
			is_s = true;
			break;
		}
		cur_r = cur_r->data > m->data ? cur_r->left : cur_r->right;
		cur_s = cur_s->data > m->data ? cur_s->left : cur_s->right;
	}

	if (!is_r && !is_s)//两个都没找到m
	{
		while (cur_r)
		{
			if (cur_r == m)
			{
				is_r = true;
				break;
			}
			cur_r = cur_r->data > m->data ? cur_r->left : cur_r->right;
		}
		while (cur_s)
		{
			if (cur_s == m)
			{
				is_s = true;
				break;
			}
			cur_s = cur_s->data > m->data ? cur_s->left : cur_s->right;
		}
		if (!is_r && !is_s)//仍然没有找到
			return false;
	}
	if (is_r)//r的后代里有m
	{
		//判断m是不是s的祖先
		while (cur_m)
		{
			if (cur_m == s)
				return true;
			cur_m = cur_m->data > s->data ? cur_m->left : cur_m->right;
		}
		return false;
	}
	if (is_s)
	{
		while (cur_m)
		{
			if (cur_m ==r)
				return true;
			cur_m = cur_m->data > r->data ? cur_m->left : cur_m->right;
		}
		return false;
	}
}
时间: 2024-12-10 12:31:18

【BST】判断节点r和s是不是一个为祖先,另一个为后代的相关文章

c# 注册表操作,创建,删除,修改,判断节点是否存在

用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和 删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1:要操作注册表,我们必须要引入必要的命名空间: C#代码    using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 2:命名空间里面提供了一个类:RegistryKey 利用它我们可以定位到注册表最开头的分支: ClassesRoot,CurrentUser,Use

Js判断一个字符串是否包含一个子串

Js中经常遇到判断一个字符串是否包含一个子串,java语言中有containes的方法,直接调用就可以了.除非引用第三方数据库,Js中没有contains方法. 为了实现更java语言中containes方法相同的效果,最简单的一种做法是利用js中字符串查找位置的方法indexOf(“o”大写).此方法的返回的值得可能有 -1,0,n(正整数)三种情况.0是当子串在字符串第1位开始包含的情况下返回,例子如下: <script> var str="he"; var strin

【C语言】判断一个字符串是否是一个字符串的旋转字符串

//判断一个字符串是否是一个字符串的旋转字符串 //利用库函数实现 #include <stdio.h> #include <string.h> #include <assert.h> int IsRotate(char *str1, const char *str2) { assert(str1); assert(str2); strncat(str1, str1,strlen(str1)); if (NULL == strstr(str1, str2)) retur

[No.000005]C#注册表操作,创建,删除,修改,判断节点是否存在

1 //用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和删除.判断注册表项是否存在.判断键值是否存在. 2 //准备工作: 3 //1:要操作注册表,我们必须要引入必要的命名空间:using Microsoft.Win32;在这个命名空间里面包含了许多注册表相关的类,足够我们使用了. 4 //2:命名空间里面提供了一个类:RegistryKey 利用它我们可以定位到注册表最开头的分支:ClassesRoot,CurrentUser,

javascript判断一个元素是另外一个元素的子元素

javascript判断一个元素是另外一个元素的子元素用途有很多,最常用的就是当点击页面的空白处去执行某些操作,比如弹出层等. function isParent (obj,parentObj){ while (obj != undefined && obj != null && obj.tagName.toUpperCase() != ‘BODY’){ if (obj == parentObj){ return true; } obj = obj.parentNode;

输入一个年份,再输入一个月份,判断其是平年还是闰年,然后输出当前月份的天数。

#region 输入一个年份,再输入一个月份,判断其是平年还是闰年,然后输出当前月份的天数. Console.WriteLine("请输入一个年份"); int year = 0;//声明一个变量year,即年份 int month = 0;//声明一个变量month.即月份 int day = 0; //声明一个变量day,即天数 bool b = true;//声明一个变量b,即"是"或"否' //捕捉异常,判断用户输入的值是否合法 try { //当

jq select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性

select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性 $("#IsRecommend").change(function () { var isCheck = $(this).children('option:selected').val(); if (isCheck == "true") { $("#CategoryId").css("display", "

如何判断一个字节是否是一个汉字中的一部分

UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序. 在UTF-8编码中一个中文占三个字节 比如 汉字 "张" 对应的三字节编码是[229 188 160] 但是如何判断,229 188 160 是组合的呢,这里涉及到一套规则 UTF规定: 如果一个符号只占一个字节,那么这个8位字节的第一位就为0. 如果为两个字节,那么规定第一个字节的前两位都为1,然后第一个字节的第三位为0,第二个字节的前两位为10 然后如果是三个字节的话,那么第一个字节的

在php中判断一个字符串包含另一个字符串

方法一:用php的strpos() 函数判断字符串中是否包含某字符串的方法 if(strpos('Longway','way') !== false){ echo '包含way'; }else{ echo '不包含way'; } 方法二:使用了explode 用explode进行判断PHP判断字符串的包含代码如下: <?php $url = "001a.gif"; $str = "a"; $con = explode($str,$url); if (count