题目链接

LeetCode

题目描述

给你一个字符串 s,找到 s 中最长的回文子串。

解题思路

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

199. 二叉树的右视图 - 图1

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100

    方法一:bfs

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. vector<int> rightSideView(TreeNode* root) {
    15. if(root==nullptr){
    16. return {};
    17. }
    18. deque<TreeNode*> dq;
    19. vector<int> ans;
    20. dq.push_front(root);
    21. while(!dq.empty()){
    22. ans.push_back(dq.back()->val);
    23. int k = dq.size();
    24. while(k--){
    25. TreeNode* tmp = dq.back();
    26. dq.pop_back();
    27. if(tmp->right){
    28. dq.push_front(tmp->right);
    29. }
    30. if(tmp->left){
    31. dq.push_front(tmp->left);
    32. }
    33. }
    34. }
    35. return ans;
    36. }
    37. };
  • 时间复杂度 O(n)

  • 空间复杂度 O(n)

    方法二:自定义数据结构bfs

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. private:
    14. // 自定义双向链表
    15. struct TreeList{
    16. TreeNode* node;
    17. TreeList* pre;
    18. TreeList* next;
    19. TreeList(){
    20. pre = nullptr;
    21. next = nullptr;
    22. node = nullptr;
    23. }
    24. TreeList(TreeNode* n){
    25. pre = nullptr;
    26. next = nullptr;
    27. node = n;
    28. }
    29. };
    30. // 双向链表的头和尾
    31. TreeList* head = new TreeList();
    32. TreeList* tail = new TreeList();
    33. public:
    34. vector<int> rightSideView(TreeNode* root) {
    35. if(root==nullptr){
    36. return {};
    37. }
    38. vector<int> ans;
    39. // 加入链表
    40. TreeList* node = new TreeList(root);
    41. head->next = node;
    42. node->pre = head;
    43. node->next = tail;
    44. tail->pre = node;
    45. // sz表示当前链表中节点的个数
    46. int sz = 1;
    47. // head->next!=tail当前链表中不为空
    48. while(head->next!=tail){
    49. // 将链表最后一个节点的值加入结果
    50. ans.push_back(tail->pre->node->val);
    51. int k = sz;
    52. while(k--){
    53. // 在链表中删除最右边的节点
    54. TreeList* tmp = tail->pre;
    55. tail->pre = tail->pre->pre;
    56. tail->pre->next = tail;
    57. sz--;
    58. // 如果链表最右边节点有右节点,用头插法加入链表
    59. if(tmp->node->right){
    60. TreeList* node = new TreeList(tmp->node->right);
    61. node->next = head->next;
    62. head->next->pre = node;
    63. head->next = node;
    64. node->pre = head;
    65. sz++;
    66. }
    67. // 如果链表最右边节点有左节点,用头插法加入链表
    68. if(tmp->node->left){
    69. TreeList* node = new TreeList(tmp->node->left);
    70. node->next = head->next;
    71. head->next->pre = node;
    72. head->next = node;
    73. node->pre = head;
    74. sz++;
    75. }
    76. }
    77. }
    78. return ans;
    79. }
    80. };
  • 时间复杂度 O(n)

  • 空间复杂度 O(n)