题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
由于二叉搜索树的特点可以知道,他的中序遍历就是他的排序,重点是怎么把各个结点的值连起来,形成双向链表。我们使用非递归的中序遍历来试一下。
代码:
public class Solution {
TreeNode Head = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null)
return pRootOfTree;
TreeNode curr = pRootOfTree;
TreeNode pre = null;
Stack<TreeNode> stack = new Stack<>();
while(curr != null || !stack.isEmpty()){
if(curr != null){
stack.push(curr);
curr = curr.left;
}else{
curr = stack.pop();
if(Head == null){
Head = curr;
pre = Head;
}//说明是第一个
else{
pre.right = curr;
curr.left = pre;
pre = curr;
}
curr = curr.right;
}
}
return Head;
}}
附上非递归中序二叉树的代码:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root==null){
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode curr = root;
while(curr != null || !(stack.isEmpty())){
if(curr!= null){
stack.push(curr);
curr = curr.left;
}else{
curr = stack.pop();
list.add(curr.val);
curr = curr.right;
}
}
return list;
}
}