如何判断一个二叉树是否为另一二叉树子树u

#include <stdio.h> 
 #include <stdlib.h> 

 // 二叉树结点定义 
 struct btree 
 { 
   int value; 
   int lchild, rchild; 
 }; 

 // A树和B树的最多结点数 
 int n, m; 

 /** 
  * 第二步判断,判断A树是否有B树的子结构 
  */
 int doesTree1HasTree2(struct btree *ahead, int numa, struct btree *bhead, int numb) 
 { 
   if (numb == -1)  
     return 1; 
   if (numa == -1) 
     return 0; 

   if (ahead[numa].value != bhead[numb].value) 
     return 0; 

   return (doesTree1HasTree2(ahead, ahead[numa].lchild, bhead, bhead[numb].lchild) && 
     doesTree1HasTree2(ahead, ahead[numa].rchild, bhead, bhead[numb].rchild)); 
 } 

 /** 
  * 第一步判断,遍历A树查找是否有等于B树根结点的子树 
  */
 int judgeChildTree(struct btree *ahead, int numa, struct btree *bhead, int numb) 
 { 
   int flag = 0; 

   if (numa != -1 && numb != -1) { 
     if (ahead[numa].value == bhead[numb].value) 
       flag = doesTree1HasTree2(ahead, numa, bhead, numb); 

     if (! flag && ahead[numa].lchild != -1) 
       flag = judgeChildTree(ahead, ahead[numa].lchild, bhead, numb); 

     if (! flag && ahead[numa].rchild != -1) 
       flag = judgeChildTree(ahead, ahead[numa].rchild, bhead, numb); 
   } 

   return flag; 
 } 

 int main(void) 
 { 
   int i, data, count, left, right, flag; 
   struct btree *ahead, *bhead; 

   while (scanf("%d %d", &n, &m) != EOF) { 
     // 获取A树的节点值 
     ahead = (struct btree *)malloc(sizeof(struct btree) * n); 
     for (i = 0; i < n; i ++) { 
       scanf("%d", &data); 
       ahead[i].value = data; 
       ahead[i].lchild = ahead[i].rchild = -1; 
     } 

     for (i = 0; i < n; i ++) { 
       scanf("%d", &count); 
       if (count == 0) { 
         continue; 
       } else { 
         if (count == 1) { 
           scanf("%d", &left); 
           ahead[i].lchild = left - 1; 
         } else { 
           scanf("%d %d", &left, &right); 
           ahead[i].lchild = left - 1; 
           ahead[i].rchild = right - 1; 
         } 
       } 
     } 

     // 获取B树的节点值 
     bhead = (struct btree *)malloc(sizeof(struct btree) * m); 
     for (i = 0; i < m; i ++) { 
       scanf("%d", &data); 
       bhead[i].value = data; 
       bhead[i].lchild = bhead[i].rchild = -1; 
     } 

     for (i = 0; i < m; i ++) { 
       scanf("%d", &count); 
       if (count == 0) { 
         continue; 
       } else { 
         if (count == 1) { 
           scanf("%d", &left); 
           bhead[i].lchild = left - 1; 
         } else { 
           scanf("%d %d", &left, &right); 
           bhead[i].lchild = left - 1; 
           bhead[i].rchild = right - 1; 
         } 
       } 
     } 

     // 判断B树是否为A的子树 
     if (n == 0 || m == 0) { 
       printf("NO\n"); 
       continue; 
     } 

     flag = judgeChildTree(ahead, 0, bhead, 0); 
     if (flag) 
       printf("YES\n"); 
     else
       printf("NO\n"); 

     free(ahead); 
     free(bhead); 
   } 

   return 0; 
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断一个二叉树是否为另一棵树的子树,可以采用递归的方法,先判断当前根节点是否相同,若相同则递归判断左右子树是否相同,若不同则递归判断二叉树的左右子树是否为目标树的子树。 具体实现步骤如下: 1. 判断当前节点是否为空,若为空则返回 false。 2. 判断当前节点是否与目标树的根节点相同,若相同则递归判断左右子树是否相同。 3. 若当前节点与目标树的根节点不同,则递归判断二叉树的左右子树是否为目标树的子树。 具体实现代码如下(假设 TreeNode 为二叉树节点的数据结构): ``` bool isSubtree(TreeNode* s, TreeNode* t) { if (!s) return false; // 若当前节点为空,返回 false if (isSameTree(s, t)) return true; // 若当前节点与目标树根节点相同,递归判断左右子树是否相同 return isSubtree(s->left, t) || isSubtree(s->right, t); // 若不同,则递归判断二叉树的左右子树是否为目标树的子树 } bool isSameTree(TreeNode* p, TreeNode* q) { if (!p && !q) return true; // 若两个节点均为空,返回 true if (!p || !q) return false; // 若其中一个节点为空,返回 false if (p->val != q->val) return false; // 若两个节点的值不同,返回 false return isSameTree(p->left, q->left) && isSameTree(p->right, q->right); // 递归判断左右子树是否相同 } ``` 其中 isSameTree 函数用于判断两个节点以及它们的子树是否相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值