题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.ArrayList;
public class Solution {
//要求不能创建任何新的结点,只能在原本树的结构中进行指针指向的调整
//利用一个list来存放中序遍历的树
private ArrayList<TreeNode> list=new ArrayList<>();
public TreeNode Convert(TreeNode pRootOfTree) {
MidOrder(pRootOfTree);
if(list.size()==0||list.size()==1){
return pRootOfTree;
}
TreeNode root=null;
TreeNode pre=null;
TreeNode next=null;
for(int i=0;i<list.size()-1;i++){
//arraylsit不能用[i]遍历,只能用get、set
if(i==0){
//当前为链表的头结点,其pre为null
root=list.get(i);
root.left=pre;
pre=root;
next=list.get(i+1);
root.right=next;
}else{
next.left=pre;
pre=next;
next=list.get(i+1);
pre.right=next;
}
}
//当前为尾结点,其next为null
next.right=null;
next.left=pre;
return root;
}
private void MidOrder(TreeNode node){
if(node==null){
return;
}
if(node.left!=null){
MidOrder(node.left);
}
list.add(node);
if(node.right!=null){
MidOrder(node.right);
}
}
}