二叉树判断值为x和y的结点是否互为兄弟结点,假设这样的结点值是唯一的

通过构造函数找某个特定值结点的双亲结点,返回其双亲结点,再嵌套进这个判断是否是兄弟结点的函数里,通过判断这两个特定结点返回的双亲结点是否相同来判断它们是否是兄弟结点,

#include"BiTree.h"
//判断值为x和y的结点是否互为兄弟结点,假设这样的结点值是唯一的
//找到特定值的结点,返回其双亲结点,使用外部输入和递归的方式
BTNode* Find(BTNode*& node, char value, BTNode** parent)
{
	if (node == NULL)
	{
		return NULL;
	}
	if (node->data == value)//单个字符比较用两个等号判断
	{
		return *parent;
	}
	//如果不是该特定值结点的话,继续往下遍历非空结点的左右子树查找
	else
	{
		BTNode* tempparent = node;
		BTNode* FindDeeply = Find(node->lchild, value, &tempparent);//往更下面深层遍历二叉树递归查找
		if (FindDeeply != NULL)
		{
			return FindDeeply;
		}
		//如果左子树遍历找不到的话再遍历右子树
		return Find(node->rchild, value, &tempparent);

	}
}
//整个完整查找特定结点的双亲结点的函数(要求通过根节点出发?)
BTNode* FindParent(BTNode* T, char value)
{

	if (T == NULL || T->data == value)
	{
		printf("二叉树为空,为无法查找\n");
		return NULL;
	}
	if (T->lchild != NULL)
	{
		BTNode* Tleft = T->lchild;
		if (Find(Tleft->lchild, value, &Tleft) != NULL)//一定要加这个条件判断,否则即使找到了并且成功返回了的话但
			//该函数并不会成功结束并返回该指针,因为递归还没有结束,不加这个if的条件判断和操作的话会继续递归回到上一个线程则只能判断是右子树的结点了
		{
			return Find(Tleft->lchild, value, &Tleft);
		}
		else
		{
			Find(Tleft->rchild, value, &Tleft);
		}
	}
	if (T->rchild != NULL)
	{
		BTNode* Tright = T->rchild;
		if (Find(Tright->lchild, value, &Tright) != NULL)
		{
			return Find(Tright->lchild, value, &Tright);
		}
		else
		{
			Find(Tright->rchild, value, &Tright);
		}
	}
}

bool isBrother(BTNode* T, char x, char y)
{
	//FindParent(T, x);
	//FindParent(T, y);
	if (FindParent(T, x) == FindParent(T, y))
	{
		printf("结点%c和%c互为兄弟结点\n",x,y);
		return true;
	}
	else
	{
		printf("结点%c和%c不是兄弟结点\n",x,y);
		return false;
	}
}

int main(int argc, char* argv[])
{
	BTNode* T;
	InitBiTree(T);
	char str[] = "1(2,3(4(6),5))";
	CreateBiTree(T, str);
	PrintBiTree(T, 0);
	isBrother(T,'2', '4');
	DestroyBiTree(T);
	return 0;
}

在这里插入图片描述

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值