题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
好悲伤,面试微软的时候被遇到这个题,知道大体思路,但是最终代码没写好,由此可见平常学东西不扎实。总是浅尝辄止。
思路:使用中序遍历,保存已经建好的双向链表的最后一个节点。那么处理当前节点的时候就很简单了,即把最后一个节点的右指针指向当前节点,当前节点的左指针指向最后一个节点。
代码如下:
package com.company;
import com.intellij.ui.GroupedElementsRenderer;
/**
* Created by founder on 2016/4/25.
*/
public class Solution {
//保存已经排好序的双向链表的最后一个节点,注意不能在递归中改
//因为java没有引用传递
public TreeNode lastSorted = null;
//将二叉搜索树改成双向链表,关键是保留已经处理好的上一个节点
//可以采用中序递归遍历的方式
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
makeList(pRootOfTree);
TreeNode head = pRootOfTree;
while(head.left!=null){
head = head.left;
}
return head;
}
public void makeList(TreeNode root){
if(root==null){
return;
}
makeList(root.left);
//如果不是null,进行修改操作,如果是null,则不需要做什么
if(lastSorted!=null) {
lastSorted.right = root;
root.left = lastSorted;
}
lastSorted = root;
makeList(root.right);
}
public static void main(String[] argv){
TreeNode t10 = new TreeNode(10);
TreeNode t6 = new TreeNode(6);
TreeNode t4 = new TreeNode(4);
TreeNode t8 = new TreeNode(8);
TreeNode t14 = new TreeNode(14);
TreeNode t12 = new TreeNode(12);
TreeNode t16 = new TreeNode(16);
t10.left = t6;
t10.right = t14;
t6.left = t4;
t6.right = t8;
t14.left = t12;
t14.right = t16;
Solution s = new Solution();
TreeNode tt = s.Convert(t10);
while (tt!=null){
System.out.println(tt.val);
tt = tt.right;
}
}
}