zoukankan      html  css  js  c++  java
  • LeetCode-剑指 Offer 二叉搜索树与双向链表

    题目链接

    题意

    将一棵二叉搜索树的结点按照从小到大的顺序构建成一个双向链表,要求不能创建新的节点。

    思路

    1. 首先很容易想到对二叉树的中序遍历可以得到升序的结点序列。
    2. 其次,维护一个头结点head,和一个始终指向当前最后一个结点的prev。
      因此每在第一步得到一个节点,就把它插入到prev的后面,并更新prev。
      注意,树中最左下的结点是第一个遍历到的结点,此时应令其为头结点,即head = cur。
    3. 遍历完成后,将头尾结点串起来。

    代码

    /*
    // 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;
        }
    };
    */
    
    Node* head, prev;
    void solve(Node* root) {
    
        if(!root)
            return ;
    
        solve(root->left);
    
        if(prev == NULL)   // 此时node是最左下的结点
            head = root;
        else
            prev->right = root;
    
        root->left = prev;
        prev = root;    // 令prev指向最后的结点
    
        solve(root->right);
    
    }
    
    Node* treeToDoublyList(Node* root) {
        if(root == NULL)
            return NULL;    //链表题目一定要考虑空的情况
      
        solve(root, ans);  // 中序遍历 + 构建双链表
        head->left = prev;  // 头结点的前驱指向尾结点
        prev->right = head; // 尾结点的后继指向头结点
        return head;
    }
    
    
  • 相关阅读:
    zoj 3279 线段树 OR 树状数组
    fzu 1962 树状数组 OR 线段树
    hdu 5057 块状链表
    hdu3487 Play with Chain
    bzoj 1588营业额统计(HNOI 2002)
    poj2823 Sliding Window
    poj2828 Buy Tickets
    poj2395 Out of Hay
    poj3667 Hotel
    poj1703 Lost Cows
  • 原文地址:https://www.cnblogs.com/daybreaking/p/14353315.html
Copyright © 2011-2022 走看看