剑指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; }