C语言判断二叉树的子树

来源:互联网 发布:文本压缩算法 编辑:程序博客网 时间:2024/06/01 10:12

题目:输入两颗二叉树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;elsecurrent = current->lchild;count--;}}if(way == 1)parent->rchild = node;elseparent->lchild = node;if(flag = 1)node->rchild = current;elsenode->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");elseprintf("NO\n");return 0;}


原创粉丝点击