题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
这道题思路很简单:
首先搜索树是所有的左子树都小于根,右子树都大于根,所以只需要按中序遍历二叉树后修改每个节点的左右子节点即可:
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
add(pRootOfTree); //将链表元素按照中序遍历存储在链表中
change();//调整左右孩子指向前后节点
return list.get(0);
}
private void add(TreeNode pRootOfTree){
if(pRootOfTree.left != null)
add(pRootOfTree.left);
list.add(pRootOfTree);
if(pRootOfTree.right != null)
add(pRootOfTree.right);
}
private void change(){
if(list.size()>=2){
//特殊节点特殊处理
list.get(0).left = null;
list.get(0).right = list.get(1);
list.get(list.size()-1).left = list.get(list.size()-2);
list.get(list.size()-1).right = null;
for(int i=1;i<list.size()-1;i++){
list.get(i).left = list.get(i-1);
list.get(i).right = list.get(i+1);
}
}
}
测试:
@Test
public void fun() {
TreeNode root = new TreeNode(5);
TreeNode one = new TreeNode(3);
TreeNode second = new TreeNode(7);
TreeNode q = new TreeNode(2);
TreeNode w = new TreeNode(4);
TreeNode e = new TreeNode(6);
TreeNode r = new TreeNode(8);
root.left=one;
root.right=second;
one.left=q;
one.right=w;
second.left=e;
second.right=r;
TreeNode node = Convert(root);
while(node!=null){
System.out.print(node.val+",");
node = node.right;
}
}
测试输出: