判断两棵二叉树是不是相同

时间:2021-12-11 11:08:45

(一)在左右节点不可以旋转的时候:

//核心代码,先确定根节点是否相同,再判断左孩子和右孩子是否相同。
bool equal(tree *root ,tree *root1)
{
if (root == NULL&&root1 == NULL)
{
return 1;
}
if (!root || !root1 )
{
return 0;
}
if (root->date == root1->date)
{
return equal(root->lchild, root1->lchild) && equal(root->rchild, root1->rchild);
}
else
return 0;
}

注意点:
若是两棵树都是输入的结果的话,需要对输入‘\n’进行处理。

//先序创建二叉树

void create_tree(tree ** root)
{
if ((*root) != NULL)
{
char put;
scanf("%c",&put);
while(put=='\n')//需要注意的地方
scanf("%c", &put);
(*root) = (tree*)malloc(sizeof(tree));
(*root)->date = put;
if (put == '.')
(*root) = NULL;
else
{
create_tree(&((*root)->lchild));
create_tree(&((*root)->rchil``
))
;
}
}
}

(二)左右节点可以旋转的情况下,即通过旋转,两棵树是相同的。

bool equal(tree *root ,tree *root1)
{
if (root == NULL&&root1 == NULL)
{
return 1;
}
if (!root || !root1 )
{
return 0;
}
if (root->date == root1->date)
{
return (equal(root->lchild, root1->lchild) && equal(root1->rchild, root1->rchild))||(equal(root->lchild, root1->rchild) && equal(root->rchild, root1->lchild));
//改变的地方只有这
}
else
return 0;
}
//先序遍历非递归版,使用该方法输出树,也有其他的遍历输出

void pre1(tree *root)
{
tree *p = root;
stack<tree*> s;
while (p != NULL||!s.empty())
{
if (p != NULL)
{
printf("%c-", p->date);
s.push(p);
p = p->lchild;
}
else
{
p = s.top();
s.pop();
p = p->rchild;
}
}

}