• 二叉树的Morris遍历


    Morris遍历的核心思想就是去,找到当前节点的左节点的最右节点,然后判断其右节点是否为空,如果为空,则将其右节点指向当前节点并让当前节点往左走;如果其右节点指向当前节点则置为空,并让当前节点往右走。如此循环直到走到最右节点结束遍历过程。

    1、遍历过程如下:

    1. class Solution {
    2. public:
    3. TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
    4. while(root){
    5. TreeNode* ll=root->left;
    6. if(ll){
    7. while(ll->right&&ll->right!=root){
    8. ll=ll->right;
    9. }
    10. if(ll->right){
    11. TreeNode* temp=root->left;
    12. ll->right=nullptr;
    13. }else{
    14. //cout<val<
    15. ll->right=root;
    16. root=root->left;
    17. continue;
    18. }
    19. }//else cout<val<
    20. root=root->right;
    21. }
    22. return nullptr;
    23. }
    24. };

    2、中序遍历

    中序遍历的核心是走一次的节点,走一次的时候直接打印,走两次的节点,第二次打印

    1. class Solution {
    2. public:
    3. TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
    4. while(root){
    5. TreeNode* ll=root->left;
    6. if(ll){
    7. while(ll->right&&ll->right!=root){
    8. ll=ll->right;
    9. }
    10. if(ll->right){
    11. TreeNode* temp=root->left;
    12. ll->right=nullptr;
    13. }else{
    14. //cout<val<
    15. ll->right=root;
    16. root=root->left;
    17. continue;
    18. }
    19. }//else cout<val<
    20. cout<val<
    21. root=root->right;
    22. }
    23. return nullptr;
    24. }
    25. };

    2、前序遍历

    前序遍历的核心第一次走到就遍历

    1. class Solution {
    2. public:
    3. TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
    4. while(root){
    5. TreeNode* ll=root->left;
    6. if(ll){
    7. while(ll->right&&ll->right!=root){
    8. ll=ll->right;
    9. }
    10. if(ll->right){
    11. TreeNode* temp=root->left;
    12. ll->right=nullptr;
    13. }else{
    14. cout<val<
    15. ll->right=root;
    16. root=root->left;
    17. continue;
    18. }
    19. }else cout<val<
    20. root=root->right;
    21. }
    22. return nullptr;
    23. }
    24. };

    2、后序遍历

    后序遍历的核心最后一次走的时候,对改节点的左子树的最右层进行逆序遍历(通过链表的反转实现,但是遍历完需要在转回去)

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    8. * };
    9. */
    10. class Solution {
    11. public:
    12. TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
    13. TreeNode* ans=root;
    14. while(root){
    15. TreeNode* ll=root->left;
    16. if(ll){
    17. while(ll->right&&ll->right!=root){
    18. ll=ll->right;
    19. }
    20. if(ll->right){
    21. ll->right=nullptr;
    22. TreeNode* temp=root->left;
    23. temp= reverse_list(temp);
    24. TreeNode* temp1=temp;
    25. while(temp1){
    26. cout<val<
    27. temp1=temp1->right;
    28. }
    29. temp=reverse_list(temp);
    30. }else{
    31. ll->right=root;
    32. root=root->left;
    33. continue;
    34. }
    35. }
    36. root=root->right;
    37. }
    38. TreeNode*temp=reverse_list(ans);
    39. TreeNode* temp1=temp;
    40. while(temp1){
    41. cout<val<
    42. temp1=temp1->right;
    43. }
    44. ans=reverse_list(temp);
    45. return nullptr;
    46. }
    47. TreeNode* reverse_list(TreeNode* node){
    48. TreeNode* pre=nullptr;
    49. while(node){
    50. TreeNode* temp=node;
    51. node=node->right;
    52. temp->right=pre;
    53. pre=temp;
    54. }
    55. return pre;
    56. }
    57. };

  • 相关阅读:
    对于一位合格的DBA,究竟需要掌握多少种数据库?
    【电控笔记5.7】Notch-Filter滤波器
    数据资产“入表”是不是红利?国企怎么认识?怎么利用?
    人群环境中基于深度强化学习的移动机器人避障算法
    Python接口自动化测试之token参数关联
    Hive之DQL操作
    Hexagon_V65_Programmers_Reference_Manual(7)
    Apinto 网关: Go语言实现 HTTP 转 gRPC
    微服务治理热门技术揭秘:动态读写分离
    windows下载redis、windows安装redis、windows启动redis
  • 原文地址:https://blog.csdn.net/yanzhe1/article/details/126069116