题目:输入两颗二叉树A和B,判断B是不是A的子结构。比如:
思路:第一步在树A中找到和B的根结点的值一样的点假设为R,第二部再判断A中以R为根结点的子树是不是包含和树B一样的结构。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct _btreenode
{
struct _btreenode *lchild; //树的左孩子
struct _btreenode *rchild; //树的右孩子
int data;
}BtreeNode;
typedef struct _btree
{
struct _btreenode *root; //头结点结构体
int count;
}Btree;
int Creat_Tree(Btree *head, int data, int pos, int count, int flag)
{
if(head == NULL || flag != 1 || flag != 0)
{
return -1;
}
BtreeNode *node = (BtreeNode *)malloc(sizeof(BtreeNode)/sizeof(char));
if(node == NULL)
{
return -1;
}
node->data = data;
node->lchild = NULL;
node->rchild = NULL;
BtreeNode *parent = NULL;
BtreeNode *current = head->root;
int way;
if(head->root == NULL)
{
head->root = node;
}
else
{
while(count)
{
way = pos & 1;
pos = pos >> 1;
parent = current;
if(way = 1)
current = current->rchild;
else
current = current->lchild;
count--;
}
}
if(way == 1)
parent->rchild = node;
else
parent->lchild = node;
if(flag = 1)
node->rchild = current;
else
node->lchild = current;
head->count++;
return 1;
}
//判断子树
int Judge_son_tree(BtreeNode *node, BtreeNode *son_node)
{
if(son_node == NULL) //递归结束标志
return 1;
if(node == NULL)
return -1;
if(node != son_node)
{
return -1;
}
return Judge_son_tree(node->rchild, son_node->rchild) && Judge_son_tree(node->lchild, son_node->lchild);
}
int main()
{
Btree *head = (Btree *)malloc(sizeof(Btree)/sizeof(char));
if(head == NULL)
{
return -1;
}
head->root = NULL;
head->count = 0;
Creat_Tree(head, 8, 0, 0 ,0 ); //插入数据。head代表头结点,8代表插入的数据,第一个0代表路径,第二个0代表在第几层,第四个0代表插入左边还是右边
Creat_Tree(head, 8, 0, 1 ,0 ); //1代表在右边插入,0代表在左边插入
Creat_Tree(head, 7, 1, 1 ,0 );
Creat_Tree(head, 9, 0, 2 ,0 );
Creat_Tree(head, 2, 2, 2 ,0 );
Creat_Tree(head, 4, 2, 3 ,0 );
Creat_Tree(head, 7, 6, 3 ,0 );
Btree *son_head = (Btree *)malloc(sizeof(Btree)/sizeof(char));
if(son_head == NULL)
return -1;
son_head->root = NULL;
son_head->count = 0;
Creat_Tree(son_head, 8, 0, 0 ,0 );
Creat_Tree(son_head, 9, 0, 1 ,0 );
Creat_Tree(son_head, 2, 1, 1 ,0 );
if(Judge_son_tree(head->root, son_head->root)) //调用判断函数,如果相等就输出YES,否则输出NO。
printf("YES\n");
else
printf("NO\n");
return 0;
}