博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
阅读量:6342 次
发布时间:2019-06-22

本文共 2907 字,大约阅读时间需要 9 分钟。

看起来很难,但是仔细想一下,实质就是二叉树的中序遍历的问题,中序遍历有递归和非递归(至少两种写法)。

递归:

class Solution {public:    Node *prev; //实质是指向最后一个元素的指针        Node* treeToDoublyList(Node* root) {        if (root==NULL) return NULL;        Node *dummy=new Node(0,NULL,NULL);        prev = dummy;        inorder(root);                prev->right = dummy->right;        dummy->right->left = prev;        return dummy->right;    }        void inorder(Node *root){        if (root==NULL) return;        inorder(root->left);        prev->right = root;        root->left = prev;        prev = root;        inorder(root->right);    }};

 

非递归

class Solution {public:    Node *prev; //实质是指向最后一个元素的指针        Node* treeToDoublyList(Node* root) {        if (root==NULL) return NULL;                stack
s; Node *dummy=new Node(0,NULL,NULL); Node *p=root, *prev=dummy; while (!s.empty() || p!=NULL){ while (p){ s.push(p); p = p->left; } p = s.top(), s.pop(); prev->right = p; p->left = prev; prev = p; p = p->right; } prev->right = dummy->right; dummy->right->left = prev; return dummy->right; }};

 

class Solution {public:    Node *prev; //实质是指向最后一个元素的指针        Node* treeToDoublyList(Node* root) {        if (root==NULL) return NULL;                Node *dummy=new Node(0,NULL,NULL);        Node *prev=dummy;                stack
s({root}); unordered_map
hash; while (!s.empty()){ Node *cur=s.top(); s.pop(); if (hash[cur]==0){ ++hash[cur]; s.push(cur); if (cur->left) s.push(cur->left); }else{ prev->right = cur; cur->left = prev; prev = cur; if (cur->right) s.push(cur->right); } } prev->right = dummy->right; dummy->right->left = prev; return dummy->right; }};

 

Divide and Conquer

思路和中序遍历很类似,但是代码写起来有一点不一样。感觉这种方法思路更加清晰。

class Solution {public:    Node* treeToDoublyList(Node* root) {        if (root==NULL) return NULL;        Node *leftHead=treeToDoublyList(root->left);        Node *rightHead=treeToDoublyList(root->right);        root->left = root; root->right = root; // make root a doublylist        return link(link(leftHead, root),rightHead);    }        Node *link(Node *head1, Node *head2){        if (head1==NULL) return head2;        if (head2==NULL) return head1;                Node *tail1=head1->left;        Node *tail2=head2->left;                tail1->right = head2;        head2->left = tail1;                tail2->right = head1;        head1->left = tail2;                return head1;    }};

 

转载于:https://www.cnblogs.com/hankunyan/p/9532493.html

你可能感兴趣的文章
IE FF(火狐) line-height兼容详解
查看>>
谷歌Pixel 3吸引三星用户, 但未动摇iPhone地位
查看>>
python获取当前工作目录
查看>>
VUE中使用vuex,cookie,全局变量(少代码示例)
查看>>
grep -w 的解析_学习笔记
查看>>
量化交易之启航
查看>>
TX Text Control文字处理教程(3)打印操作
查看>>
CENTOS 7 如何修改IP地址为静态!
查看>>
MyCat分片算法学习(纯转)
查看>>
IO Foundation 3 -文件解析器 FileParser
查看>>
linux学习经验之谈
查看>>
mysqld_multi实现多主一从复制
查看>>
中介模式
查看>>
JS中将变量转为字符串
查看>>
servlet笔记
查看>>
JVM(五)垃圾回收器的前世今生
查看>>
CentOS 7 下安装 Nginx
查看>>
Spring Boot 自动配置之@EnableAutoConfiguration
查看>>
为了学习go我从0开始用beego写了一个简单个人博客(2)登陆管理
查看>>
职业女性:学会减压救自己!
查看>>