题目描述:
输入一颗二叉搜索树,将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针指向为链表中指向后一个结点的指针。
由于要求转换后是排好序的链表,所以应该采用中序遍历的方法。
当遍历到根节点的时候,我们把树看成三部分
值为10的根结点,根结点值为6的左子树,根结点值为14的右子树。
我们需要把值为10的结点与左子树中最大的结点8, 右子树中最小的结点12连在一起。
代码
public class ConvertTest {
static class TreeNode{
int value;
TreeNode left;
TreeNode right;
public TreeNode(int v) {
this.value = v;
}
}
public static TreeNode convert(TreeNode root){
TreeNode lastNodeInList = null;
convertNode(root, lastNodeInList);
if(lastNodeInList == null){
System.out.println("lastNodeInList == null");
}
TreeNode listHead = lastNodeInList;
while(listHead != null && listHead.left != null){
listHead = listHead.left;
}
return listHead;
}
private static void convertNode(TreeNode node, TreeNode lastNodeInList) {
if(node == null){
return;
}
TreeNode currentNode = node;
if(currentNode.left != null){
convertNode(currentNode.left, lastNodeInList);
}
currentNode.left = lastNodeInList;
if(lastNodeInList != null){
lastNodeInList.right = currentNode;
}
lastNodeInList = currentNode;
if(lastNodeInList != null){
System.out.println("Set last = " + lastNodeInList.value);
}else{
System.out.println("Set last = null");
}
if(currentNode.right != null){
convertNode(currentNode.right, lastNodeInList);
}
}
public static void main(String[] args) {
TreeNode root = new TreeNode(10);
TreeNode node6 = new TreeNode(6);
TreeNode node14 = new TreeNode(14);
TreeNode node4 = new TreeNode(4);
TreeNode node8 = new TreeNode(8);
TreeNode node12 = new TreeNode(12);
TreeNode node16 = new TreeNode(16);
root.left = node6;
root.right = node14;
node6.left = node4;
node6.right = node8;
node14.left = node12;
node14.right = node16;
TreeNode head = convert(root);
if(head == null){
System.out.println("head == null");
}
TreeNode node = head;
while(node != null){
System.out.println(node.value);
node = node.right;
}
}
}
说明
上面这段代码是有问题的,最后lastNodeInList == null,不知道问题在哪,理论上是传递的引用应该没有问题。这个后面在解决。