• 体系班第十三节


    1判断完全二叉树递归做法

    有四种情况:1 左树完全,右数满,且左高为右高加一

    2左满 ,右满,左高为右高加一

    3左满,右完全,左右高相等

    4左右均满且高相等

    1. #include
    2. #include
    3. using namespace std;
    4. class TreeNode {
    5. public:
    6. int val;
    7. TreeNode* left;
    8. TreeNode* right;
    9. TreeNode(int a) :val(a), left(nullptr), right(nullptr) {};
    10. };
    11. struct info {
    12. int height;
    13. bool iscbt;
    14. bool isfull;
    15. info(int a,bool b,bool c):height(a),iscbt(b),isfull(c){}
    16. };
    17. info process(TreeNode* head)
    18. {
    19. if (head == nullptr)
    20. return info(0, true, true);
    21. info leftinfo = process(head->left);
    22. info rightinfo = process(head->right);
    23. int height = max(leftinfo.height, rightinfo.height) + 1;
    24. bool isfull = leftinfo.isfull && rightinfo.isfull && leftinfo.height == rightinfo.height;
    25. bool iscbt = false;
    26. if (leftinfo.isfull && rightinfo.isfull && leftinfo.height - rightinfo.height == 1)
    27. iscbt = true;
    28. if (leftinfo.isfull && rightinfo.isfull && leftinfo.height ==rightinfo.height )
    29. iscbt = true;
    30. if (leftinfo.iscbt && rightinfo.isfull && leftinfo.height - rightinfo.height == 1)
    31. iscbt = true;
    32. if (leftinfo.isfull && rightinfo.iscbt && leftinfo.height == rightinfo.height)
    33. iscbt = true;
    34. return info(height, iscbt, isfull);
    35. }
    36. bool iscbt(TreeNode* head)
    37. {
    38. if (head == nullptr)
    39. return true;
    40. return process(head).iscbt;
    41. }

    2 给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. class TreeNode {
    6. public:
    7. int val;
    8. TreeNode* left;
    9. TreeNode* right;
    10. TreeNode(int data) : val(data), left(nullptr), right(nullptr) {}
    11. };
    12. struct info {
    13. TreeNode* node;//最大搜索子树头结点
    14. int maxsize;
    15. int min;
    16. int max;
    17. info(TreeNode *a,int b,int c,int d):node(a),maxsize(b),min(c),max(d){}
    18. };
    19. info* process(TreeNode* head)
    20. {
    21. if (head == nullptr)
    22. return nullptr;
    23. info* leftinfo = process(head->left);
    24. info* rightinfo = process(head->right);
    25. int maxval = head->val;
    26. int minval = head->val;
    27. TreeNode* ans = nullptr;
    28. int size = 0;
    29. if (leftinfo != nullptr)
    30. {
    31. maxval = max(maxval, leftinfo->max);
    32. minval = min(minval, leftinfo->min);
    33. ans = leftinfo->node;
    34. size = leftinfo->maxsize;
    35. }
    36. if (rightinfo != nullptr)
    37. {
    38. maxval = max(maxval, rightinfo->max);
    39. minval = min(minval, rightinfo->min);
    40. if (rightinfo->maxsize > size)
    41. {
    42. ans = rightinfo->node;
    43. size = rightinfo->maxsize;
    44. }
    45. }
    46. //当能构成搜索二叉树时
    47. if((leftinfo==nullptr?true:(leftinfo->node==head->left&&leftinfo->maxval))
    48. && (rightinfo == nullptr ? true : (rightinfo->node == head->right && rightinfo->min > head->val)))
    49. {
    50. ans=head;
    51. //一定要记得判空
    52. size = (leftinfo == nullptr ? 0 : leftinfo->maxsize) + (rightinfo == nullptr ? 0 : leftinfo->maxsize) + 1;
    53. }
    54. return new info(ans, size, minval, maxval);
    55. }
    56. TreeNode* maxSubBSTHead2(TreeNode* head)
    57. {
    58. if (head == nullptr)
    59. return nullptr;
    60. return process(head)->node;
    61. }

    3给定一棵二叉树的头节点head,和另外两个节点a和b,返回a和b的最低公共祖先

    法1:用哈希表记下所有节点父节点,将一个节点不停地向上,这其中经过的节点放入一个集合中

    再在另一个节点从上遍历,一遍查找是否在集合中已经存在过,找到的第一个即为答案

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. class TreeNode {
    6. public:
    7. int val;
    8. TreeNode* left;
    9. TreeNode* right;
    10. TreeNode(int data) : val(data), left(nullptr), right(nullptr) {}
    11. };
    12. void fillmap(TreeNode* head, unordered_map &map)
    13. {
    14. if (head->left != nullptr)
    15. {
    16. map[head->left] = head;
    17. fillmap(head->left, map);
    18. }
    19. if (head->right != nullptr)
    20. {
    21. map[head->right] = head;
    22. fillmap(head->right, map);
    23. }
    24. }
    25. TreeNode* lowestAncestor(TreeNode* head, TreeNode* p, TreeNode* q)
    26. {
    27. if (head == nullptr)
    28. return nullptr;
    29. unordered_map map;//记录所有节点的父节点
    30. map[head] = nullptr;
    31. fillmap(head,map);
    32. unordered_set set;
    33. TreeNode* cur = p;
    34. set.insert(cur);
    35. while (map[cur] != nullptr)
    36. {
    37. cur = map[cur];
    38. set.insert(cur);
    39. }
    40. cur = q;
    41. while (set.find(cur) == set.end())
    42. {
    43. cur = map[cur];
    44. }
    45. return cur;
    46. }

    法二:递归套路,会聚点与x有关还是无关:无关:已经在左或右树右答案,或这棵树a,b没找全

    x是答案:左发现一个,右发现一个

    x本身就是a,然后左右发现了b   x本身就是b,左右发现a

    1. #include
    2. using namespace std;
    3. // 节点类
    4. class Node {
    5. public:
    6. int value;
    7. Node* left;
    8. Node* right;
    9. Node(int data) : value(data), left(nullptr), right(nullptr) {}
    10. };
    11. // 最低公共祖先函数
    12. Node* lowestAncestor2(Node* head, Node* a, Node* b) {
    13. return process(head, a, b).ans;
    14. }
    15. // 信息结构体
    16. struct Info {
    17. bool findA;
    18. bool findB;
    19. Node* ans;
    20. Info(bool fA, bool fB, Node* an) : findA(fA), findB(fB), ans(an) {}
    21. };
    22. // 处理函数
    23. Info process(Node* x, Node* a, Node* b) {
    24. if (x == nullptr) {
    25. return Info(false, false, nullptr);
    26. }
    27. Info leftInfo = process(x->left, a, b);
    28. Info rightInfo = process(x->right, a, b);
    29. bool findA = (x == a) || leftInfo.findA || rightInfo.findA;//不要忘了x本身就是a的情况
    30. bool findB = (x == b) || leftInfo.findB || rightInfo.findB;
    31. Node* ans = nullptr;
    32. if (leftInfo.ans != nullptr) {
    33. ans = leftInfo.ans;
    34. }
    35. else if (rightInfo.ans != nullptr) {
    36. ans = rightInfo.ans;
    37. }
    38. else {
    39. if (findA && findB) {
    40. ans = x;
    41. }
    42. }
    43. return Info(findA, findB, ans);
    44. }

    4  派对的最大快乐值
     员工信息的定义如下:
    class Employee {
        public int happy; // 这名员工可以带来的快乐值
        List subordinates; // 这名员工有哪些直接下级
    }
    公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树
    树的头节点是公司唯一的老板,除老板之外的每个员工都有唯一的直接上级
    叶节点是没有任何下属的基层员工(subordinates列表为空),除基层员工外每个员工都有一个或多个直接下级
    这个公司现在要办party,你可以决定哪些员工来,哪些员工不来,规则:
    1.如果某个员工来了,那么这个员工的所有直接下级都不能来
    2.派对的整体快乐值是所有到场员工快乐值的累加
    3.你的目标是让派对的整体快乐值尽量大
    给定一棵多叉树的头节点boss,请返回派对的最大快乐值。

    分情况:x来,x不来,定义一个结构体,保存两个值,x来时候的最大值,x不来时候的最大值

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. struct employee {
    6. int happy;
    7. vector nexts;
    8. employee(int h):happy(h),nexts(){}
    9. };
    10. struct info {
    11. int yes;
    12. int no;
    13. info(int a,int b):yes(a),no(b){}
    14. };
    15. info process(employee* head)
    16. {
    17. if (head == nullptr)
    18. return info(0, 0);
    19. int yes = head->happy;
    20. int no = 0;
    21. for (employee* a : head->nexts)
    22. {
    23. info nextinfo = process(a);
    24. yes += nextinfo.no;
    25. no += max(nextinfo.yes, nextinfo.no);
    26. }
    27. return info(yes, no);
    28. }
    29. int maxhappy(employee* head)
    30. {
    31. info allinfo = process(head);
    32. return max(allinfo.no, allinfo.yes);
    33. }

    5给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

    贪心:局部最小得全体最优解,有时候可能会有错

     字典序:字符串排大小,长度一样比数字大小

    长度不同:较短的补上最小的阿斯克码值,然后与长的比较

    证明过程:得先证明排序过程具有传递性 ,像石头剪刀布就没有传递性

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. class compare {
    6. public:
    7. bool operator()(string a, string b)
    8. {
    9. return (a + b) < (b + a);
    10. }
    11. };
    12. string lowestString(vector str)
    13. {
    14. if (str.empty())
    15. return "";
    16. sort(str.begin(), str.end(), compare());
    17. string a="";
    18. for (string c : str)
    19. {
    20. a += c;
    21. }
    22. return a;
    23. }

     

  • 相关阅读:
    使用 Gradle 构建 Java 项目
    linux硬盘分区和挂载
    MAP和MLE的区别(自用)
    CTFshow web(文件上传158-161)
    美容院微信小程序怎么添加会员管理功能
    PostgreSQL数据优化——死元组清理
    java101-arraylist的遍历和增加
    1.Linux入门基本指令
    普元中间件Primeton AppServer6.5部署SuperMap iServer
    LibreOJ - 2874 历史研究 (回滚莫队)
  • 原文地址:https://blog.csdn.net/2201_75715662/article/details/136573017