zoukankan      html  css  js  c++  java
  • 树的同构

    • 题目描述

    • C语言实现
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdbool.h>
    
    #define MaxSize 100
    
    typedef char ElementType;
    
    struct TNode
    {
    	ElementType Elem;
    	int Left;
    	int Right;
    }T1[MaxSize],T2[MaxSize];
    
    int BuildeTree(struct TNode T[])
    {
    	int N;
    	int Root = -1;
    	int i = 0;
    	char cl, cr;
    	int check[MaxSize];
    	scanf("%d
    ",&N);
    	if (N != 0)
    	{
    		for (i = 0;i < N;i++)
    		{
    			check[i] = 0;
    		}
    		for (i = 0;i < N;i++)
    		{
    			scanf("%c %c %c
    ",&T[i].Elem,&cl,&cr);
    			if (cl != '-')
    			{
    				T[i].Left = cl - '0';
    				check[T[i].Left] = 1;
    			}
    			else
    			{
    				T[i].Left = -1;  //-1表示没有子节点
    			}
    			if (cr != '-')
    			{
    				T[i].Right = cr - '0';
    				check[T[i].Right] = 1;
    			}
    			else
    			{
    				T[i].Right = -1;  //-1表示没有子节点
    			}
    		}
    		for (i = 0; i < N;i++)
    		{
    			if (!check[i])
    			{
    				Root = i;
    				break;
    			}
    		}
    	}
    	return Root;
    }
    
    bool Isomorphism(int R1,int R2)
    {
    	//先对基本情况进行判断
    	if (R1 == -1 && R2 == -1)
    	{
    		return true;  //两颗树都是空树,一定同构
    	}
    	if ((R1 == -1 && R2 != -1)
    		||(R1 != -1 && R2 == -1))
    	{
    		return false;  //一颗为空树 另一个颗不是空树 一定不同构
    	}
    	if (T1[R1].Elem != T2[R2].Elem)
    	{
    		return false;  //两颗树的根节点不相同 必定不同构
    	}
    	if (T1[R1].Left == -1 && T2[R2].Left == -1)
    	{
    		Isomorphism(T1[R1].Right, T2[R2].Right);  //左子树为空 则判断其右子树
    	}
    	if ((T1[R1].Left != -1 && T2[R2].Left != -1) &&
    		(T1[T1[R1].Left].Elem == T2[T2[R2].Left].Elem))
    	{
    		//不用交换左右子树
    		return (Isomorphism(T1[R1].Left,T2[R2].Left) && Isomorphism(T1[R1].Right, T2[R2].Right));
    	}
    	else
    	{
    		//需要交换左右子树
    		return (Isomorphism(T1[R1].Left, T2[R2].Right) && Isomorphism(T1[R1].Right, T2[R2].Left));
    	}
    }
    
    int main()
    {
    	int R1, R2;
    	R1 = BuildeTree(T1);
    	R2 = BuildeTree(T2);
    	if (Isomorphism(R1,R2))
    	{
    		printf("Yes");
    	}
    	else
    	{
    		printf("No");
    	}
    	// system("pause");
    	return 0;
    }
    

    值得一提的是,这道题目也是用递归的思想来解决。

  • 相关阅读:
    JSP
    token防止表单重复提交
    web应用程序性能优化
    js 优化
    文本查看及处理工具简单命令
    DNS之一---DNS服务及BIND服务,并实现DNS正向与反向解析
    企业级自动化运维工具应用实战ansible
    Linux小试牛刀
    Linux特殊权限及ACL权限
    文件的默认权限UMASK
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11425124.html
Copyright © 2011-2022 走看看