【LeetCode & 剑指offer刷题】树题14:36 二叉搜索树与双向链表
【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
36 二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
方法一:中序遍历迭代法
参考题目: Validate Binary Search Tree)
*/
class Solution
{
public
:
TreeNode
*
Convert
(
TreeNode
*
root
)
{
if
(
root
==
nullptr
)
return
nullptr
;
TreeNode
*
head
=
root
;
while(head->left) head = head->left;
//
二叉搜索树中最左子结点即为中序遍历的第一个结点
stack
<
TreeNode
*>
s
;
TreeNode
*
p
=
root
,
*
pre
=
nullptr
;
while
(
p
||
!
s
.
empty
())
{
if
(
p
)
{
s
.
push
(
p
);
p
=
p
->
left
;
}
else
{
p
=
s
.
top
();
p->left = pre; //连接p与pre
if(pre) pre->right = p; //连接pre与p
pre = p; //更新pre
s
.
pop
();
p
=
p
->
right
;
}
}
return head;
}
};
/*
方法二:中序遍历递归法(左、根、右)
*/
class
Solution
{
private
:
TreeNode
*
pre
;
public
:
TreeNode
*
Convert
(
TreeNode
*
pRootOfTree
)
{
if
(
pRootOfTree
==
nullptr
)
return
nullptr
;
pre
=
nullptr
;
//初始化成员变量,用于记录上一次访问的结点
convertNode
(
pRootOfTree
);
TreeNode
*
head
=
pRootOfTree
;
while
(
head
->
left
)
head
=
head
->
left
;
//二叉搜索树中最左子结点即为中序遍历的第一个结点
return
head
;
}
private
:
void
convertNode
(
TreeNode
*
cur
)
{
if
(
cur
==
nullptr
)
return
;
//转换左子树
convertNode
(
cur
->
left
);
//转换根结点
cur
->
left
=
pre
;
if
(
pre
)
pre
->
right
=
cur
;
pre
=
cur
;
//记录被处理过的结点
//转换右子树
convertNode
(
cur
->
right
);
}
};
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
中序遍历迭代法
*/
posted @
2019-01-05 19:49 wikiwen 阅读(
...) 评论(
...) 编辑 收藏