通过构造函数找某个特定值结点的双亲结点,返回其双亲结点,再嵌套进这个判断是否是兄弟结点的函数里,通过判断这两个特定结点返回的双亲结点是否相同来判断它们是否是兄弟结点,
#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;
}