输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
这个题目有两种方法,一是递归,另外就是利用栈;我们知道排序树的中序遍历结果就是排序,本题就是利用中序遍历,只不过多了指针指向。
递归:
TreeNode head=null;
TreeNode
realHead=null;
public TreeNode
Convert(TreeNode pRootOfTree) {
ConvertSub(pRootOfTree);
return realHead;
}
public
void ConvertSub(TreeNode pRootOfTree)
{
if(pRootOfTree==null)
return;
ConvertSub(pRootOfTree.left);
if(head==null)
{
head=pRootOfTree;
realHead=pRootOfTree;
}
else
{
head.right=pRootOfTree;
pRootOfTree.left=head;
head=pRootOfTree;
}
ConvertSub(pRootOfTree.right);
}
非递归:
public
TreeNode Convert(TreeNode pRootOfTree) {
if
(pRootOfTree
==null) {
return
null;
}
TreeNode
head =null;
boolean
isFirst
=true;
Stack
s =new
Stack<>();
TreeNode
pre =null;
while
(!s.isEmpty() || pRootOfTree
!=null) {
if
(pRootOfTree
!=null) {
s.push(pRootOfTree);
pRootOfTree
= pRootOfTree.left;
}else
{
TreeNode
cur = s.pop();
if
(isFirst) {
isFirst
=false;
head
= cur;
pre
= cur;
}else
{
cur.left
= pre;
pre.right
= cur;
pre
= cur;
}
pRootOfTree
= cur.right;
}
}
return
head;
}