数的子结构

来源:互联网 发布:淘宝上退款多久能到账 编辑:程序博客网 时间:2024/05/17 01:28

需求:
输入两颗二叉树A和B,判断B树是不是A树的子结构。如果是返回1,不是返回0。
这里写图片描述
思路
解决这个问题可以大致分为两步:
第一步:在树A中找到和树B的根节点的值一样的节点R,
第二步:判断树A中以R为根节点的子树是不是包含和树B一样的子结构。
因为在计算机中,如果两个浮点树判断大小会出现误差。不能直接写x==y
所以如果两个数的差值如果很小,那么我们就认为这两个数字是相等的。
实现

//判断两个数是否相同(比较精确)int equal(int num1, int num2){    if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)){        return 1;    }    return 0;}

找到A树中找到和树B的根节点值相同的节点R

int HasSubTree(BTNode *root1, BTNode *root2){    int flag = 0;    if (root1&&root2){        if (equal(root1->data, root2->data)){//当前两颗二叉树的节点数据域相同            flag = doesTree1HaveTree2(root1, root2);        }        if (!flag){//向左遍历找到和子树根节点数据域相同的二叉树节点            flag = HasSubTree(root1->left, root2);        }        if (!flag){//向右遍历扎到和子树根节点数据域相同的二叉树节点            flag = HasSubTree(root1->right, root2);        }    }    return flag;}

判断树A中以R为节点的根节点是不是包含和树B一样的子结构。

int doesTree1HaveTree2(BTNode *root1, BTNode *root2){    if (!root2){        return 1;    }    if (!root1){        return 0;    }    return doesTree1HaveTree2(root1->left, root2->left) && doesTree1HaveTree2(root1->right, root2->right);}

调试部分:

//定义二叉树的节点typedef struct node{    int data;    struct node *left;    struct node *right;}BTNode;//创建二叉搜索树BTNode* creatBinSortTree(int data[], int len){    BTNode *root = NULL, *pa = NULL, *c = NULL, *p = NULL;    for (int i = 0; i < len; i++){        //为新节点分配单元        p = (BTNode*)malloc(sizeof(BTNode));        //初始化新节点        p->data = data[i];        p->left = p->right = NULL;        if (!root){            root = p;        }        else{            c = root;            while (c){                pa = c;                if (p->data < c->data){                    c = c->left;                }                else{                    c = c->right;                }            }            if (pa->data > p->data){                pa->left = p;            }            else{                pa->right = p;            }        }    }    return root;}int main(void){    int data[8] = { 3, 2, 5, 8, 4, 7, 6, 9 };    int data1[3] = { 1, 2, 3 };    BTNode *root1 = creatBinSortTree(data, 8);    BTNode *root2 = creatBinSortTree(data1, 3);    BTNode *root3 = creatBinSortTree(data, 3);    printf("%d \n",HasSubTree(root1,root2));    printf("%d ",HasSubTree(root1,root3));    system("pause");    return 0;}

调试结果:
这里写图片描述