二叉树同构问题
1.静态链表
物理上用数组存储,思想为链表形式
struct TreeNode{
Element
int Left;
int right;
}
用 -1 表示指向空,数字表示指向的数组下标
在右边无序的数组中, 0,3,4都被使用,因此只有** 1 **没有被指向,判断出1为root
2.同构函数逻辑
- 左右都为空树
- 一棵树为空
- 判断根结点
- 树没有左结点,返回判断右结点
- a. 左边都不空,判断左边和左边元素、右边和右边的元素
b.可能是左右交换,判断左边和右边,右边和左边。
int Isomorphic(Tree R1, Tree R2)
{
if ((R1 == Null) && (R2 == Null)) // 左右子树都为空
return 1;
if (((R1==Null)&&(R2!=Null)) || ((R1!=Null)&&(R2==Null)))
return 0; // 其中一颗子树为空
if (T1[R1].Element != T2[R2].Element)
return 0; // 空结点为空
if ((T1[R1].Left == Null ) && ( T2[R2].Left == Null)) // 根的左右结点没有子树
return Isomorphic(T1[R1].Right, T2[R2].Right);
if (((T1[R1].Left != Null) && (T2[R2].Left!=Null)) &&
((T1[T1[R1].Left].Element) == (T2[T2[R2].Left].Element))) // 左右子树不需要转换
{
return (Isomorphic(T1[R1].Left, T2[R2].Left) &&
Isomorphic(T1[R1].Right, T2[R2].Right));
}
else { // 左右子树需要转换
return (Isomorphic(T1[R1].Left, T2[R2].Right) &&
Isomorphic(T1[R1].Right, T2[R2].Left));
}
}