• 二叉树的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. };

  • 相关阅读:
    分析报告显示,PHP是编程语言主力军,且在电商领域占据“统治地位”
    小程序用vue编写,保存表单出错
    第二个Maven工程_java培训
    一个较通用的makefile解析
    基于区块链的数据共享访问控制模型
    机器学习 —— 线性回归 简单使用
    MYSQL之外键约束
    攻防世界WEB练习-fileclude
    功能测试与性能测试的区别是什么?
    制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计
  • 原文地址:https://blog.csdn.net/yanzhe1/article/details/126069116