题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:
利用二叉树的中序遍历方法来实现排序。首先判断给定的根节点是否为空,如果为空那么就直接返回 null ;如果不为空,那就开始遍历他的每一个节点。定义一个栈stack,用来存放每次遍历(cur)的不为空的根节点。如果cur为空了,栈中不为空的话,那么就将栈顶元素弹出,再将弹出的这个元素存放在list中,给cur赋值为这个元素的右孩子(左孩子已经都遍历完了),依次遍历,直至外层循环栈stack为空,或者cur 的值为空,退出循环,list中的顺序是我们需要的,现在需要将list中的元素变成双向链表,那么就将第0个元素的left 为第一个元素,第一个元素的right为第0个元素,依次循环下去,就满足了我们的需求。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null){
return null;
}
Stack<TreeNode> stack = new Stack<>();
List<TreeNode> list = new LinkedList<>();
TreeNode cur = pRootOfTree;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
if(!stack.isEmpty()){
cur = stack.pop();
list.add(cur);
cur = cur.right;
}
}
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);
}
return list.get(0);
}
}