用C语言判断一个二叉树是否为另一个的子结构
1、问题描述: 如何判断一个二叉树是否是另一个的子结构? 2 有个子结构是 2、分析问题: 拿这道题来讲,什么时候递归结束。 <1>第二个二叉树root2为空时,说明root2是第一棵二叉树的root1的子结构,返回true。 <2>当root1为空时,此时root2还没为空,说明root2不是root1的子结构,返回false。 <3>递归下面有两种思路: 方法一:现在root1中找结点值与root2的值相等的结点,如果找到就判断root2是不是这个结点开头的子结构。所以,首先IsSubTree()判断。 方法二:就是直接判断,相同就递归判断root2左右子树是不是也是相应的子结构。如果值不相同,就分别递归到root1的左右子树寻找。尤其要注意最后两句递归的逻辑判断。 3、习题实例 题目描述: 实现
/** * 第一步判断,遍历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,numb); if (! flag && ahead[numa].rchild != -1) flag = judgeChildTree(ahead,ahead[numa].rchild,numb); } return flag; } 第二步,进一步判断A中以R为根节点的子树是不是与B树具有相同的结点 /** * 第二步判断,判断A树是否有B树的子结构 */ int doesTree1HasTree2(struct btree *ahead,int numb) { if (numb == -1) return 1; if (numa == -1) return 0; if (ahead[numa].value != bhead[numb].value) return 0; return (doesTree1HasTree2(ahead,bhead[numb].lchild) && doesTree1HasTree2(ahead,bhead[numb].rchild)); }
#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,bhead[numb].rchild)); } /** * 第一步判断,遍历A树查找是否有等于B树根结点的子树 */ int judgeChildTree(struct btree *ahead,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",&left); bhead[i].lchild = left - 1; } else { scanf("%d %d",&right); bhead[i].lchild = left - 1; bhead[i].rchild = right - 1; } } } // 判断B树是否为A的子树 if (n == 0 || m == 0) { printf("NOn"); continue; } flag = judgeChildTree(ahead,0); if (flag) printf("YESn"); else printf("NOn"); free(ahead); free(bhead); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 带有grouped_options_for_select命令的se
- SQLite3在Win7命令行上面的乱码
- objective-c – 向嵌套的NSDictionary添加键
- 单元测试 – 如何通过单元测试产生高效的代码?
- PostgreSQL 数据库导入导出操作
- 10 3D对象的衣服(Material)
- Ruby str.match(regex)返回仅包含第一个匹配项的MatchData
- VB.Net UDP中的Filetransfer应用程序与TCP和
- ajax – jQuery:非常简单的自制无限滚动
- ruby – YAML :: Dumper没有引用标量字符串“ – ”