zoukankan      html  css  js  c++  java
  • 剑指offer36.将BST原地转换为双向循环链表

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

     特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

    注意点:

    • 中序遍历BST即为排序序列
    • 建立dummy节点,简化代码
    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        Node* left;
        Node* right;
    
        Node() {}
    
        Node(int _val) {
            val = _val;
            left = NULL;
            right = NULL;
        }
    
        Node(int _val, Node* _left, Node* _right) {
            val = _val;
            left = _left;
            right = _right;
        }
    };
    */
    class Solution {
    public:
        // 自定义成员变量不能在这初始化  Node dummy(0); wrong
        Node dummy;
        Node *pre = &dummy, *head = pre;
        
        void dfs(Node* cur) {
            if (!cur) return;
            //中序遍历
            dfs(cur->left);
            
            // 对当前节点的操作,建立dummy节点处理更方便
            pre->right = cur;
            cur->left = pre;
            pre = cur;
            
            dfs(cur->right);
        }
        
        Node* treeToDoublyList(Node* root) {
            if (!root) return root;
            
            dfs(root);
            // 处理首尾节点,首节点left指向尾节点,尾节点right指向首节点
            head = head->right;
            head->left = pre;
            pre->right = head;
            
            return head;
        }
    };
  • 相关阅读:
    Socket.IO API Server
    Socket.IO 中文笔记
    Express 中文API 笔记
    JWT
    Sass 记录
    CSS高级技巧(二)背景和边框
    CSS高级技巧(一)常见的注意事项
    CSS进阶(二十四)流向的改变
    linux应用之test命令详细解析
    数字证书原理(ssl,https)
  • 原文地址:https://www.cnblogs.com/betaa/p/12654086.html
Copyright © 2011-2022 走看看