在二叉树中,每个节点都有两个指向子节点的指针,在双向链表中,每个节点也有两个指针,分别指向前一个节点和后一个节点。由于这两种节点的结构相似,同时二叉搜索树也是一种排序的数据结构,因此,在理论上有可能实现二叉搜索树和排序双向链表的转换。在搜索二叉树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值,因此我们将二叉搜索树转换成排序双向链表时,原先指向左子节点的指针调整为链表中指向前一个节点指针,原先指向右子节点的指针调整为链表中指向够一个节点的指针。
由于要求转换之后的链表是排序号的,我们可以中序遍历输中的每个节点,这是因为中序遍历算法的特别是从小打到大的顺序遍历二叉树的每个节点。当遍历到根节点的时候,我们把树看成三部分,
package question36_convert_tree_list;
/**
* @Classname Solution
* @Description TODO
* @Date 2020/3/27 19:59
* @Created by mmz
*/
public class Solution {
public class TreeNode{
int value;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int value) {
this.value = value;
}
}
TreeNode head = null;
public TreeNode Convert(TreeNode root){
if (root == null) return root;
Convert(root.right);
if (head == null){
head =root;
}else {
head.left = root;
root.right =head;
head = root;
}
Convert(root.left);
return head;
}
}
记住从右边开始遍历,right head 设置的意思就是前一个 如果第一个,前一个就为head