leetcode 426. 将二叉搜索树转化为排序的双向链表 medium

39 篇文章 0 订阅

leetcode 426. 将二叉搜索树转化为排序的双向链表  medium          

题目描述:

将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。

解题思路:

方法一:递归解决问题,主要就是细心

方法二(这个方法好):因为要求是排序的双向链表,而这颗树是二叉搜索树,所以可以直接用循环的中序遍历来做,搞定每一个节点。

递归代码:

/*
// 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* treeToDoublyList(Node* root) {
        
        if (!root)
            return root;
        
        Node *l_beg = treeToDoublyList(root->left);
        Node *r_beg = treeToDoublyList(root->right);

        Node *l_end = l_beg?l_beg->left:nullptr;
        if (l_end){
            l_end->right = root;
            root->left = l_end;
        }
        Node *beg = l_beg?l_beg:root;
        Node *end = r_beg?r_beg->left:root;
        if (r_beg){
            root->right = r_beg;
            r_beg->left= root;
        }

        beg->left = end;
        end->right = beg;
        return beg;
    }

};

循环代码:

/*
// 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* treeToDoublyList(Node* root) {
        
        if (!root)
            return root;
        
        Node dummy(0);
        Node *pre = &dummy, *cur = root;
        stack<Node*> stk;
        while (!stk.empty() || cur){
            while(cur){
                stk.push(cur);
                cur = cur->left;
            }
            cur = stk.top();
            stk.pop();
            cur->left = pre;
            pre->right = cur;
            pre = cur;
            cur = cur->right;
        }

        Node *ret = dummy.right;
        ret->left = pre;
        pre->right = ret;
        return ret;
    }
};

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值