剑指OFFER(百度笔试)——二叉树的子结构

百度软件开发实习生笔试:

1.模拟短作业优先调度算法,计算平均等待时间,例如输入[0,2,4,8]表示四个作业分别是第0s到、第2s到、第4s到、第8s到。[2,1,6,3]表示四个作业的运行时间。

计算平均等待时间。每个作业的等待时间:实际开始时间-到达时间。(不可剥夺)

2.二叉树的子结构,输入两棵树A、B,判断B是不是A的子树。

3.第三道题记不得了。貌似也是操作系统的。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 二叉树的子结构:

最近可以总结一下关于树的算法题了。

子树问题就是,判断一棵树是不是另一棵树的子树。经常出现各大公司的笔试题中。

 

其实,树(二叉树)的很多问题都可以用递归解决。因为结构是一样的嘛。

struct TreeNode
{
    int val;
    TreeNode *next;
    TreeNode(int v) : val(v), next(NULL) {}
};

定义了一个isSame的函数,判断两棵树是不是一模一样的二叉树。其实如果要一棵树T2是另一棵树T1的子结构,一定是有一部分他们是一模一样的,可能T1没到叶节点,但是T2必须要判断到叶节点。

因此isSame的出口条件是T2==NULL&&T1!=NULL(是子树),T2!=NULL&&T1==NULL(不是子树)。

    bool isPart(TreeNode* pRoot1, TreeNode* pRoot2) {
        if (pRoot2 == NULL)
            return true;
        if (pRoot1 == NULL)
            return false;
        if (pRoot1->val == pRoot2->val)
            return isPart(pRoot1->left, pRoot2->left) && isPart(pRoot1->right, pRoot2->right);
        else return false;
    }

只是从哪里开始一模一样,需要判断的。

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {

        if (pRoot2 == NULL || pRoot1 == NULL)
            return false;
        bool result = false;
        if (pRoot1->val == pRoot2->val)
            result = isPart(pRoot1, pRoot2);
        if (result == false)
            return HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
        else return result;

    }

 

posted @ 2016-04-27 20:17  0giant  阅读(787)  评论(1编辑  收藏  举报