/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
由于这两种结点的结构相似,同时二叉搜索树也是一种排序的数据结构,因此在理论上有可能实现二叉搜索树和排序的双向链表的转换。
在搜索二叉树中,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值。
因此我们在转换成排序双向链表时,
1.原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向后一个结点指针。
接下来我们考虑该如何转换。

2.由于要求转换之后的链表是排好序的,我们可以中序遍历树中的每一个结点, 这是因为中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个结点。
当遍历到根结点的时候,我们把树看成三部分:值为 10 的结点、根结点值为 6 的左子树、根结点值为 14 的右子树。
根据排序链表的定义,值为 10 的结点将和它的左子树的最大一个结点(即值为 8 的结点)链接起来,
同时它还将和右子树最小的结点(即值为 12 的结点)链接起来,
按照中序遍历的顺序, 当我们遍历转换到根结点(值为 10 的结点)时,它的左子树已经转换成一个排序的链表了,
并且处在链表中的最后一个结点是当前值最大的结点。
我们把值为 8 的结点和根结点链接起来,此时链表中的最后一个结点就是 10 了。
接着我们去地历转换右子树, 并把根结点和右子树中最小的结点链接起来。
至于怎么去转换它的左子树和右子树,由于遍历和转换过程是一样的,我们很自然地想到可以用递归。
*/
public class Solution
{
public TreeNode Convert(TreeNode root)
{
if(root==null)return null;
if(root.left==null&&root.right==null)return root;
//左子树
TreeNode left=Convert(root.left);//root为10开始
TreeNode p=left;
while(p!=null&&p.right!=null)
{
p=p.right;
}
if(left!=null)
{
//如果左子树转换成的双向链表不为空,设置尾结点的后继
p.right=root;//8指向10,
root.left=p;//10指向8
}
//右子树
TreeNode right=Convert(root.right);//先求出12
if(right!=null)
{
root.right=right;//10指向12
right.left=root;//12指向10
}
return left!=null?left:root;
}
}
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
/*
由于这两种结点的结构相似,同时二叉搜索树也是一种排序的数据结构,因此在理论上有可能实现二叉搜索树和排序的双向链表的转换。
在搜索二叉树中,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值。
因此我们在转换成排序双向链表时,
1.原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向后一个结点指针。
接下来我们考虑该如何转换。

2.由于要求转换之后的链表是排好序的,我们可以中序遍历树中的每一个结点, 这是因为中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个结点。
当遍历到根结点的时候,我们把树看成三部分:值为 10 的结点、根结点值为 6 的左子树、根结点值为 14 的右子树。
根据排序链表的定义,值为 10 的结点将和它的左子树的最大一个结点(即值为 8 的结点)链接起来,
同时它还将和右子树最小的结点(即值为 12 的结点)链接起来,
按照中序遍历的顺序, 当我们遍历转换到根结点(值为 10 的结点)时,它的左子树已经转换成一个排序的链表了,
并且处在链表中的最后一个结点是当前值最大的结点。
我们把值为 8 的结点和根结点链接起来,此时链表中的最后一个结点就是 10 了。
接着我们去地历转换右子树, 并把根结点和右子树中最小的结点链接起来。
至于怎么去转换它的左子树和右子树,由于遍历和转换过程是一样的,我们很自然地想到可以用递归。
*/
public class Solution
{
public TreeNode Convert(TreeNode root)
{
if(root==null)return null;
if(root.left==null&&root.right==null)return root;
//左子树
TreeNode left=Convert(root.left);//root为10开始
TreeNode p=left;
while(p!=null&&p.right!=null)
{
p=p.right;
}
if(left!=null)
{
//如果左子树转换成的双向链表不为空,设置尾结点的后继
p.right=root;//8指向10,
root.left=p;//10指向8
}
//右子树
TreeNode right=Convert(root.right);//先求出12
if(right!=null)
{
root.right=right;//10指向12
right.left=root;//12指向10
}
return left!=null?left:root;
}
}