题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
题意如图所示:
package test;
import java.util.ArrayList;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
ArrayList<TreeNode> list = new ArrayList<>();
Convert(pRootOfTree, list);
return Convert(list);
}
//中序遍历,在list中按遍历顺序保存
public void Convert(TreeNode pRootOfTree, ArrayList<TreeNode> list){
if(pRootOfTree != null){
Convert(pRootOfTree.left,list);//.left和.right不要忘记
list.add(pRootOfTree);
Convert(pRootOfTree.right,list);
}
}
//遍历list,修改指针
public TreeNode Convert(ArrayList<TreeNode> list) {//这里的返回值是TreeNode
for (int i = 0; i < list.size() - 1; i++) {
list.get(i).right = list.get(i + 1);
list.get(i + 1).left = list.get(i);
}
System.out.println("双向链表最后一个的数的右边:"+list.get(list.size()-1).right);//输出null,也就是说双向链表的最后一个数并不指向第一个数
return list.get(0);
}
}
public class Main{
public static void main(String[] args) {
TreeNode n1 = new TreeNode(5);//804
TreeNode n2 = new TreeNode(3);//805
TreeNode n3 = new TreeNode(7);//806
TreeNode n4 = new TreeNode(2);//807
TreeNode n5 = new TreeNode(4);//808
TreeNode n6 = new TreeNode(6);//809
TreeNode n7 = new TreeNode(8);//810
n1.left = n2;
n1.right = n3;
n2.left = n4;
n2.right = n5;
n3.left = n6;
n3.right = n7;
Solution solution = new Solution();
TreeNode list1=solution.Convert(n1);
for(;list1.right != null;){
System.out.print("->" + list1.right.val);
list1 = list1.right;
}
}
}