树的应用之相同树的判断

来源:互联网 发布:select两张表所有数据 编辑:程序博客网 时间:2024/06/14 03:40

什么是两颗树相等?

这里需要节点在树中的位置和数值都一样。

如何判断呢?

其实也是用到了递归的思想,从根节点开始,判断值是否相同,若相同,分别递归进左右子树,只要有一点不匹配,返回false。

思路如下:

1.先判断根节点是否都为空----若是,直接返回1;若一个空一个不空,直接返回0

2.在判断根节点的值----若不相等,直接返回0;若相等,递归进左右子树


详细代码:

#include <stdio.h>#include <iostream>using namespace std;#define MaxTree 10typedef char ElementType;typedef int Tree;struct TreeNode{ ElementType Data; Tree  Left; Tree  Right;} T1[MaxTree], T2[MaxTree];Tree BuildTree(struct TreeNode T[]);int  Isomorphic(Tree R1, Tree R2);int main(){ Tree R1, R2; R1 = BuildTree(T1); R2 = BuildTree(T2); if (Isomorphic(R1, R2))  printf("Yes\n"); else  printf("No\n"); return 0;}Tree BuildTree(struct TreeNode T[]){ int N; Tree Root;      // 根结点 cin >> N; if (N) {  int *check = new int[N];  for (int i = 0; i < N; i++)   check[i] = 0;  for (int i = 0; i < N; i++) {   char c_left, c_right;   cin >> T[i].Data >> c_left >> c_right;   if (c_left != '-') {    T[i].Left = c_left - '0';    check[T[i].Left] = 1;   }   else {    T[i].Left = -1;   }   if (c_right != '-') {    T[i].Right = c_right - '0';    check[T[i].Right] = 1;   }   else {    T[i].Right = -1;   }  }  int i;  for (i = 0; i < N; i++) {   if (!check[i])    break;  }  Root = i; } else  Root = -1; return Root;}int  Isomorphic(Tree R1, Tree R2){ if ((R1 == -1) && (R2 == -1))//判断节点是否都空  return 1; if (((R1 == -1) && (R2 != -1)) || ((R1 != -1) && (R2 == -1)))//判断节点是否一个空一个不空  return 0; if (T1[R1].Data != T2[R2].Data)//判断节点的数值是否相等  return 0; else {     return Isomorphic(T1[R1].Left,T2[R2].Left) && Isomorphic(T1[R1].Right,T2[R2].Right);// 递归进入左右子树 }}