E:\arithmetic\SubTree
思路:分两部分判断,先判断根节点的值是否一样,一样的话判断子节点是否也一致
#include <stdio.h>
#define END (-2000)
typedef struct BinaryTreeNode{
int value;
struct BinaryTreeNode *lChild;
struct BinaryTreeNode *rChild;
}TreeNode;
TreeNode* insertNodePre(int arr[], int *i);
void preOrder(TreeNode *r);
int findSub(TreeNode* root, TreeNode *sub);
int main(int argc, char *argv[])
{
int arr[] = {8, 8, 9, END, END, 2, 4, END, END, 7, END, END, 7, END, END};
int i = 0;
TreeNode *root = insertNodePre(arr, &i);
preOrder(root);
printf("\n");
int arr2[] = {8, 9, END, END, 2, END, END};
i = 0;
TreeNode *sub = insertNodePre(arr2, &i);
preOrder(sub);
printf("\n");
int arr3[] = {2, 4, END, END, 7, END, 9, END, END};
i = 0;
TreeNode *sub2 = insertNodePre(arr3, &i);
preOrder(sub2);
printf("\n");
int flag = findSub(root, sub2);
printf("%d\n", flag);
return 0;
}
int findSub(TreeNode* root, TreeNode *sub){//找到是1 没找到是0
if(root != NULL)
printf("findSub\t%d\n", root->value);
else
printf("findSub\tNULL\n" );
if( (root == NULL) || (sub == NULL)){
return 0;
}
int flag = 0;
if(root->value == sub->value){
flag = subOK(root, sub);
}
if(flag)
return flag;
flag = findSub(root->lChild, sub);
if(flag)
return flag;
flag = findSub(root->rChild, sub);
return flag;
}
int subOK(TreeNode *root, TreeNode *sub){
if(root != NULL)
printf("subOK\t%d\n", root->value);
else
printf("subOK\tNULL\n" );
if( (root == NULL) )//!!!不能跟子树一起判断是否为NULL,因为是包含关系,而不是绝对相等,可能的一种情况是root树有孩子而子树没有了,就不用判断了。
return 0;
if(sub == NULL)//!!!
return 1;
int flag = 1;
if(root->value != sub->value)
return 0;
if(sub->lChild != NULL)//注意:是拿子树的子节点判断
flag = subOK(root->lChild, sub->lChild);
if(flag && sub->rChild != NULL)
flag = subOK(root->rChild, sub->rChild);
return flag;
}
//前序遍历构建二叉树,输入数组前, 要先将所有的叶子节点进行扩展,保证所有的叶子节点都为NULL
TreeNode* insertNodePre(int arr[], int *i){
int k = *i;//!!!直接用arr[*i]不对
if(arr[k] == END){
k++;
*i = k;
return NULL;
}
int j;
TreeNode *t = malloc(sizeof(TreeNode));
t->value = arr[k];
k++;
*i = k;
t->lChild = insertNodePre(arr, i);
t->rChild = insertNodePre(arr, i);
return t;
}
void preOrder(TreeNode *r){
if(r == NULL){
return;
}
printf("%d\t", r->value);
preOrder(r->lChild);
preOrder(r->rChild);
}