• 翻转单词序列、按之字形顺序打印二叉树、二叉搜索树的第k个节点


    1、翻转单词序列

    本题考点:子串划分,子串逆置 牛客链接

    题目描述:

    牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

    数据范围:1≤n≤100 
    进阶:空间复杂度 O(n)  ,时间复杂度 O(n)  ,保证没有只包含空格的字符串

    解题思路:

    以空格作为分隔将子串进行划分进行逆置,然后在对子串整体进行逆置。

    代码:

    1. class Solution {
    2. public:
    3. void Reverse(string& str, int begin, int end)
    4. {
    5. while(begin < end)
    6. {
    7. char temp = str[begin];
    8. str[begin] = str[end];
    9. str[end] = temp;
    10. begin++;
    11. end--;
    12. }
    13. }
    14. string ReverseSentence(string str) {
    15. if(str.empty())
    16. return "";
    17. int j = 0;
    18. int i = 0;
    19. int len = str.size();
    20. while(i < len)
    21. {
    22. while(i < len && str[i] != ' ') i++;
    23. Reverse(str, j, i - 1);
    24. while(i < len && str[i] == ' ') i++;
    25. j = i;
    26. }
    27. Reverse(str, j, i - 1);
    28. Reverse(str, 0, str.size() - 1);
    29. return str;
    30. }
    31. };

    2、按之字形顺序打印二叉树

    本题考点:树遍历,stackqueue结合使用

    题目描述:

    给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

    数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=1500
    要求:空间复杂度:O(n),时间复杂度:O(n)

    解题思路:

    代码:

    1. class Solution {
    2. public:
    3. vectorint> > Print(TreeNode* pRoot) {
    4. vectorint>> result;
    5. if(pRoot == nullptr)
    6. return result;
    7. stack st;
    8. queue qe;
    9. int dir = 1; / 1从左向右 2从右向左 (控制方向)
    10. st.push(pRoot);
    11. while(!st.empty())
    12. {
    13. vector<int> v;
    14. while(!st.empty())
    15. {
    16. TreeNode* cur = st.top();
    17. st.pop();
    18. v.push_back(cur->val);
    19. /控制左右子树顺序
    20. TreeNode* first = dir == 1 ? cur->left : cur->right;
    21. TreeNode* second = dir == 1 ? cur->right : cur->left;
    22. /入队列暂存
    23. if(first != nullptr)
    24. qe.push(first);
    25. if(second != nullptr)
    26. qe.push(second);
    27. }
    28. /移到栈中
    29. while(!qe.empty())
    30. {
    31. st.push(qe.front());
    32. qe.pop();
    33. }
    34. dir == 1 ? dir = 2 : dir = 1; /改变方向
    35. result.push_back(v);
    36. }
    37. return result;
    38. }
    39. };

    3、二叉搜索树的第k个节点

    本题考点:二叉搜索树的理解 牛客链接

    题目描述:

    给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。

    1.返回第k小的节点值即可

    2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1

    3.保证n个节点的值不一样

    数据范围:0≤n≤1000,0≤k≤1000,树上每个结点的值满足0≤val≤1000
    进阶:空间复杂度O(n),时间复杂度 O(n)

    解题思路:

    1、方法一:递归中序遍历。

    2、方法二:迭代借助栈来完成中序遍历。

    方法一比较简单,这里说下方法二的解题思路。
    (1)将左子树全部入栈,出栈的时候判断其右子树是否为空。若不为空则把右子树当做新的树来将其左子树也全部入栈。

    (2)这里的判断条件确实不太容易想,正常容易想到的就是栈不为空,但并不是这样,如图。

     代码:

    1. class Solution {
    2. public:
    3. /方法一:
    4. void levelNode(TreeNode* proot, int& k, int& find)
    5. {
    6. if(proot == nullptr || k <= 0)
    7. return;
    8. levelNode(proot->left, k, find);
    9. k--;
    10. if(k == 0)
    11. {
    12. find = proot->val;
    13. return;
    14. }
    15. levelNode(proot->right, k, find);
    16. }
    17. int KthNode(TreeNode* proot, int k) {
    18. if(proot == nullptr)
    19. return -1;
    20. int find = -1;
    21. levelNode(proot, k, find);
    22. return find;
    23. }
    24. /方法二:
    25. int KthNode(TreeNode* proot, int k) {
    26. if(proot == nullptr)
    27. return -1;
    28. stack st;
    29. TreeNode* node = proot;
    30. do
    31. {
    32. while(node != nullptr)
    33. {
    34. st.push(node);
    35. node = node->left;
    36. }
    37. if(!st.empty())
    38. {
    39. TreeNode* front = st.top();
    40. st.pop();
    41. k--;
    42. if(k == 0)
    43. return front->val;
    44. /右子树不为空,将其作为根节点继续入栈
    45. if(front->right)
    46. node = front->right;
    47. }
    48. }while(node != nullptr || !st.empty());
    49. return -1;
    50. }
    51. };

  • 相关阅读:
    2022.8.9考试平衡的余数--1000题解
    MySQL学习系列(10)-每天学习10个知识
    分布式事务产生的原因
    CesiumJS 2022^ 源码解读[0] - 文章目录与源码工程结构
    《使用Gin框架构建分布式应用》阅读笔记:p52-p76
    观测云产品更新|Pipeline 使用体验优化;支持写入用户的自定义事件;自定义查看器支持选择更多类型的数据等
    前端vue项目获取当前登录用户id以及后端将MultipartFile转换为Base64字符串
    mycat分片规则
    IMFI DAO & World of Balatroon:土地出售即将到来!
    Zbrainsoft Dose for Excel 3.6.x 插件 Crack
  • 原文地址:https://blog.csdn.net/C_Trip/article/details/128108964