题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路解析:
- 用栈来做,把根节点的左子树,左子树的左子树,......全部放入栈中,然后弹出的肯定是最小值
- 注意要把最左边的作为头节点,存起来list
- 只要栈不为空,或者是root还有节点,就可以一直去连接
- 访问过的节点存为pre,可以进行下一次的循环
代码:
import java.util.Stack;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null)
return null;
TreeNode root = pRootOfTree;
TreeNode pre = null,list = null;
Stack<TreeNode> s = new Stack<>();
while(root!=null || !s.isEmpty()){
while(root!=null){//压栈,连续的左子节点
s.push(root);
root = root.left;
}
root = s.pop();//栈顶是最左边的节点
if(list == null)//第一次即最左节点为链表的头节点
list = root;
if(pre != null){//前后进行连接即可
pre.right = root;
root.left = pre;
}
pre = root;//记录上次遍历的节点
root = root.right;
}
return list;
}
}