题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
有上图的分析可以看出,通过中序遍历的方法就可以将一棵平衡二叉树转为排序的双向链表(平衡二叉树通过中序便利的方式就可以按照从小到大的顺序排列,遍历过程中改变指针指向即可。)
实现1:两个指针,右指针不断右移完成遍历和指针设置
实现2:一个指针,从中序遍历的最后一个节点开始向左遍历
中序遍历
* step1:二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,分别指向它的前一个和后一个节点
* step2:由于要求转换后的节点是排好序的,我们可以中序遍历树中的每一个节点,因为中序遍历的特点是按照从小到大的顺序遍历二叉树中的每一个节点。
* step3:按照中序遍历的顺序,当我们把遍历转换到根节点(值为10的节点)时,它的左子树已经变成一个排序链表了,并且处在链表中的最后一个节点是当前值最大的节点。我们把值为8的节点和根节点连接起来,此时链表中的最后一个节点就是10。接着去遍历转换右子树,并把根节点和右子树最小的值连接起来。
实现3:
3.堆栈实现
利用栈实现二叉树的中序遍历:
用中序遍历的方法,每遍历到一个节点时,将该节点保存下来,然后在遍历下一个节点之前,将保存节点的right指向下一个节点,将下一个节点的left指向上一个节点,这样就会形成一个排序的双向链表。然后将之前指向保存的指针指向当前这个节点.
其实是一个TreeNode的遍历,利用一个栈来实现二叉树的中序遍历。
实现4:
参考博客:
1.https://www.cnblogs.com/edisonchou/p/4793345.html
2.https://www.cnblogs.com/zle1992/p/8035140.html
3.https://www.cnblogs.com/yi-hui/p/8983825.html