×

树的同构

求解释非同构根树与非同构树?c语言 数据结构 判别两个二叉树同构 编译Error Id returned 1 exit status,代码贴在下面了,求解答

admin admin 发表于2022-09-01 23:15:47 浏览114 评论0

抢沙发发表评论

本文目录

求解释非同构根树与非同构树


非同构的树可以参照非同构图;非同构根数又在非同构图的基础上规定了树根,也就是说如果两个树的树根不同,但它们是同构图,那么它们也是非同构根树。可以看出非同构根数的个数≥非同构图(树)的个数。

c语言 数据结构 判别两个二叉树同构 编译Error Id returned 1 exit status,代码贴在下面了,求解答


你这个代码的问题主要就是buildtree这个函数的问题

Tree BuildTree(struct TreeNode *T)//建立二叉树
{
    int N, i,Root;
    char cl, cr; 
    scanf(“%d\n“, &N);
    int check[N];//chack用来判别哪个结点不是任何结点的孩子,找出根节点
    if(N)
    {
        for (i=0; i《N; i++)
        check[i] = 0;//将check初值都变成0
        for (i=0; i《N; i++)
        {
            scanf(“%c %c %c\n“, &T[i].Element, &cl, &cr);//第一个直接赋给element
            if(cl!=’-’)//第二个临时赋给cl,判断cl是不是‘-’
            {
                T[i].Left = cl-’0’;//不是‘-’把字符变成数字
                check[T[i].Left] = 1;//把对应的check改为1
            }
            else 
                T[i].Left = Null;//如果是‘-’就使左孩子=-1,Null = -1
            if(cr!=’-’)//和上面的处理一样
            {
                T[i].Right = cr-’0’;
                check[T[i].Right] = 1;
            }
            else 
                T[i].Right = Null;
        }
        for(i=0; i《N; i++)
        if(!check[i]) break;//找到第几个是根节点
            Root = i;
    }
    return Root;//输出根节点的位置
}
-树的同构

二叉树怎么判断同构的呢


最优做法是hash+最小表示法,大致思路就是试着把二叉树用hash值表示出来。对整棵树进行后序遍历,将一个节点的左右子树hash值都求出之后,保证左子树的哈希值恒小于右子树,否则就交换左右子树,然后算该子树的hash值。 最后比对根节点hash值即可。-树的同构

该算法的时间复杂度为稳定的O(N),如果选的hash函数不太慢的话(事实上这题适用的hash可以非常快)。为了严谨性应对hash进行防冲突操作,比如开闭散列,但是仍然不会影响复杂度。额外空间复杂度考虑后序遍历的特性对hash存储进行优化,可以达到O(depth),但是最坏情况下也是O(N)级别的。-树的同构

再来说说vczh的答案。他的做法没有错,可以得到正确的解,问题是树较接近满二叉树的时候复杂度会变得很高。在最坏的满二叉树的状况下,每个叶子节点会被访问2的logn次方也就是n次,再加上一共有n/2个叶子节点,那么总复杂度可以达到平方级别。接近满二叉树的大部分情况的复杂度,也是近似如此。 也许有人会认为这只是个别极端情况,但是同样只在个别极端情况下会退化的非随机快排,也被认为是不够优秀的,想必没有哪个标准库的快排会在极端条件下退化成平方复杂度吧。-树的同构

在vczh底下评论的vani是我的大学同学,高中时的全国信息学竞赛银牌,国家集训队,大学时acm区域赛金牌拿到手软,还拿到了world final的金牌第三名。平心而论,若要说算法和数据结构题,全国甚至全世界想要找几个能碾压他的人也不是那么容易的。所以看到很多人试图用“轮子哥你也有资格质疑“的态度还是觉得挺有趣的。-树的同构


判断两个二叉树是否同构(相似)


题目: 给出两个二叉树的根结点,判断这两个二叉树是否同构,同构即表示两棵树形状形式,只是value不同而已。 直接递归判断。bool _istongG(Node* t1, Node* t2){if(NULL == t1 || NULL == t2)
-树的同构

关于数据结构的同构二叉树的问题


第五个功能就是交换左右子树的部分孩子节点
#include《iostream.h》
#include《malloc.h》
#define FALSE 0
#define TRUE 1
#define OK 1
#define maxsize 100
typedef int status;
typedef int elemtype;
typedef struct binode
{
elemtype data;
struct binode *lchild,*rchild;
}binode,*bitree;
status treecreated=FALSE;
int leafcount=0;
status createbitree(bitree *t);
status preordertraverse(bitree t);
int height(bitree t);
void swap(bitree *t);
void leafcounts(bitree t);
void main()
{
int choice=0;
status leave=FALSE,flag;
binode *bt;
cout《《“===========二叉树演示程序===============“《《endl;
do
{
cout《《“1:创建一个二叉树,按先序遍历结果输入,空用0表示 “《《endl;
cout《《“2:先序遍历二叉树,递归方式遍历二叉树 “《《endl;
cout《《“3:求叶子数“《《endl;
cout《《“4:计算二叉树的高度“《《endl;
cout《《“5: 树进行左右翻转“《《endl;
cout《《“0:退出“《《endl;
cout《《“-------请输入你的选择:“《《endl;
cin》》choice;
switch(choice)
{
case 1:
if(treecreated)
{
cout《《“sorry,the tree has been already created!“《《endl;
break;
};
cout《《“请输入代表树的数字:“《《endl;
flag=createbitree(&bt);
if(flag==OK)
{
cout《《“你已经建立了一棵树了!“《《endl;
treecreated=TRUE;
}
break;

case 2:
if(!treecreated)
{
cout《《“sorry,you must create a tree for further steps!“《《endl;
break;
}
cout《《“先序遍历顺序:“《《endl;
preordertraverse(bt);
cout《《endl;
break;

case 3:
if(!treecreated)
{
cout《《“sorry,you must create a tree for further steps!“《《endl;
break;
}
leafcounts(bt);
cout《《“树的叶子数:“《《leafcount《《endl;
cout《《endl;
break;

case 4:
int h;
h=height(bt);
cout《《“树的高度:“《《h《《endl;
break;

case 5:
swap(&bt);
cout《《“树已经翻转!!!“《《endl;
break;

case 0:
leave=TRUE;
break;
}
}while(!leave);
cout《《“ 谢谢 再见了!!!“《《endl;
}
//递归方法实现创建
status createbitree(bitree *t)
{
int ch=0;
cin》》ch;
if(ch==0) //输入如果是0表示是空
(*t)=NULL;
else
{
(*t)=(bitree)malloc(sizeof(binode)); //申请空间
(*t)-》data=ch; //把数据传给他
createbitree(&(*t)-》lchild); //左孩子重新进入创建函数
createbitree(&(*t)-》rchild); //右孩子重新进入创建函数
}
return OK;
}
//递归方法实现先序遍历
status preordertraverse(bitree t)
{
if(t)
{
cout《《t-》data《《“ “; //先把头结点输出
preordertraverse(t-》lchild); //然后是左结点
preordertraverse(t-》rchild); //然后是右结点
return OK;
}
else
return OK;
}
int height(bitree t)
{
int hl,hr;
if(t==NULL)
return 0;
hl=height(t-》lchild)+1; //最下面的左孩子加一
hr=height(t-》rchild)+1; //最下面的右孩子加一
return (hl》hr?hl:hr); //比较谁大就取谁
}
void swap(bitree *t) //进行左右翻转
{
bitree p;
if(*t!=NULL)
{
p=(*t)-》lchild; //p为中间变量
(*t)-》lchild=(*t)-》rchild;
(*t)-》rchild=p;
swap(&(*t)-》lchild);
swap(&(*t)-》rchild);
}
}
void leafcounts(bitree t) //求叶子数
{
if(t) //如果不为空
{
if(t-》lchild==NULL && t-》rchild==NULL)//左右孩子都为空 表明是叶子
leafcount++;
leafcounts(t-》lchild);
leafcounts(t-》rchild);
}
}
-树的同构

你好我是一名学生有个问题想请教一下:关于两棵无序树是否同构应该如何判断这里的同构就是形态相同标签


这个问题不容易的,这都4年前的问题了我晕,这种问题只有oi党acm党
能回答吧。
首先你要给每个子树定个顺序,将每个子树hash,用这个hash值来定顺序,小的子树放前面,至于这个hash函数怎么定,可以用子树个数再随意定一下权值乘一下。
如果你是竞赛党肯定知道我在说什么,如果不是,肯定不知道我在说什么。
这个方法理论上可能把不同的子树判成相同,但就实际做题情况来看,hash函数稍微科学点几乎碰不到错的
-树的同构

数据结构 二叉树同构


#include《iostream.h》
#include《malloc.h》
#define FALSE 0
#define TRUE 1
#define OK 1
#define maxsize 100
typedef int status;
typedef int elemtype;
typedef struct binode
{
elemtype data;
struct binode *lchild,*rchild;
}binode,*bitree;
status treecreated=FALSE;
int leafcount=0;
status createbitree(bitree *t);
status preordertraverse(bitree t);
int height(bitree t);
void swap(bitree *t);
void leafcounts(bitree t);
void main()
{
int choice=0;
status leave=FALSE,flag;
binode *bt;
cout《《“===========二叉树演示程序===============“《《endl;
do
{
cout《《“1:创建一个二叉树,按先序遍历结果输入,空用0表示 “《《endl;
cout《《“2:先序遍历二叉树,递归方式遍历二叉树 “《《endl;
cout《《“3:求叶子数“《《endl;
cout《《“4:计算二叉树的高度“《《endl;
cout《《“5: 树进行左右翻转“《《endl;
cout《《“0:退出“《《endl;
cout《《“-------请输入你的选择:“《《endl;
cin》》choice;
switch(choice)
{
case 1:
if(treecreated)
{
cout《《“sorry,the tree has been already created!“《《endl;
break;
};
cout《《“请输入代表树的数字:“《《endl;
flag=createbitree(&bt);
if(flag==OK)
{
cout《《“你已经建立了一棵树了!“《《endl;
treecreated=TRUE;
}
break;
case 2:
if(!treecreated)
{
cout《《“sorry,you must create a tree for further steps!“《《endl;
break;
}
cout《《“先序遍历顺序:“《《endl;
preordertraverse(bt);
cout《《endl;
break;
case 3:
if(!treecreated)
{
cout《《“sorry,you must create a tree for further steps!“《《endl;
break;
}
leafcounts(bt);
cout《《“树的叶子数:“《《leafcount《《endl;
cout《《endl;
break;
case 4:
int h;
h=height(bt);
cout《《“树的高度:“《《h《《endl;
break;
case 5:
swap(&bt);
cout《《“树已经翻转!!!“《《endl;
break;
case 0:
leave=TRUE;
break;
}
}while(!leave);
cout《《“ 谢谢 再见了!!!“《《endl;
}
//递归方法实现创建
status createbitree(bitree *t)
{
int ch=0;
cin》》ch;
if(ch==0) //输入如果是0表示是空
(*t)=NULL;
else
{
(*t)=(bitree)malloc(sizeof(binode)); //申请空间
(*t)-》data=ch; //把数据传给他
createbitree(&(*t)-》lchild); //左孩子重新进入创建函数
createbitree(&(*t)-》rchild); //右孩子重新进入创建函数
}
return OK;
}
//递归方法实现先序遍历
status preordertraverse(bitree t)
{
if(t)
{
cout《《t-》data《《“ “; //先把头结点输出
preordertraverse(t-》lchild); //然后是左结点
preordertraverse(t-》rchild); //然后是右结点
return OK;
}
else
return OK;
}
int height(bitree t)
{
-树的同构

假设二叉树是链式存储结构,设计一个算法判断一颗二叉树是否对称同构,对称就是指左右子树的结构是对称


我不理解为什么你第一句用&&而第二句用||。
不过我觉得你这个递归应该再写简单一点
bool func(BTNode *b,BTNode *c)
{
bool like1,like2;
if(b==NULL&&c==NULL)
return true;
else if(b==NULL&&c!=NULL||b!=NULL&&c==NULL)
return false;
else
{
like1=func(b-》lchild,c-》rchild);
like2=func(b-》rchild,c-》lchild);
if(like1&&like2)
return true;
else
return false;
}
}
你的构造函数没给我,所以在我这里也不能运行。
你先用我的试试,如果不行的话把你的全部代码给我,这样我能更好看一些。
-树的同构

怎么读出这个树结构


树结构(tree)由n(n异0)个结点的有限集 合所构成的一种数据结构。当n~。时称为空树,非空 树递归定义如下:①有且仅有一个称为根的结点;②其 余结点可分为二(。)0)个互不相交的子集,其中每 一个子集本身又是一棵树,称为根的子树。树结构在客 观世界中广泛存在,也是程序设计中各种信息的重要 组织~一。 树中的结点包含一个数据元素及若于指向其子树 的分支。结点拥有的子树数(分支数)称为该结点的度, 用石表示。度为o的结点称为叶或终端结点;度不为O 的结点称为分支结点或非终端结点。树中各结点的度 的最大值称为树的度。树是一种层次结构,结点的层次 从根开始定义,根为第一层,若某结点在第艺层,则其 子树的根为第i+1层。树中结点的最大层次称为树的 深度或高度。若树中各结点的子树之间在逻辑上存在 顺序关系的,则称该树为有序树;否则,称为无序树。 在计算机中,通常采用多链式存储结构来表示树 结构。对树的操作有:①检索树中的结点;②遍历树中 各结点,即按某种规则巡访树中每个结点,使得每个结 点被访问一次且仅访问一次;③添加子树;④删除子树 等。 在程序设计中较广泛使用的树结构有: (1)二叉树:度k毛2的有序树。二叉树与一般树 (度龙》2的k叉树)之间存在一种一一对应的转换算 法。在通常采用的用同构(等长)的多链式存储结构表 示的树吟二叉树的密度最高·因此,二叉树除了本身 有着广泛的用途外,还可以用作一般树的存储结构。 (2)霍夫曼(Huffman)树:带权路径长度最短的 二叉树。带权路径长度是从根到树中所有带权叶子之 间的路径长度与树的乘积之和。根据给定的一组权值, 构造一棵相应的Huffman树的算法,称为Huffman算 法。Huf如an树有着广泛的应用,如在解决某些判定问 题时,利用Huffman树可以得到最佳的判定算法;在 快速远距离通信中,可以得到编码长度最短的编码。
-树的同构