题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
1.递归:二叉搜索树的中序遍历即有序的 本题可以考虑为是一个改进版的中序遍历,在左右子树递归中间 设置双向指针、
每次遍历节点的左孩子、右孩子,把左孩子指向转换链表的尾节点,并把末尾指针的右孩子指向自己。右孩子指向节点的右孩子。如果没有右孩子就返回。这一过程可以用递归实现。
2.非递归:中序遍历 用栈实现 把从root到最左的左节点 都压进栈 然后按顺序pop出来,并且遍历其是否有右节点。
代码
1.递归
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode head = null;
TreeNode end = null;
public TreeNode Convert(TreeNode pRootOfTree) {
inorder(pRootOfTree);
return head;
}
public void inorder(TreeNode root){
if(root==null) return;
inorder(root.left);
if(end==null){
//头结点
head = root;
end = root;
}else{
//设置前后结点双向指向关系
end.right=root;
root.left=end;
end = root;
}
inorder(root.right);
}
}
2.非递归
TreeNode head = null;
TreeNode end = null;
public TreeNode Convert(TreeNode pRootOfTree) {
/*inorder(pRootOfTree);
return head;*/
Stack<TreeNode> stack = new Stack<>();
while(pRootOfTree!=null||!stack.isEmpty()){
while(pRootOfTree!=null){
stack.push(pRootOfTree);
pRootOfTree=pRootOfTree.left;
}
pRootOfTree=stack.pop();
if(end==null){
head = pRootOfTree;
end = pRootOfTree;
}else{
end.right = pRootOfTree;
pRootOfTree.left = end;
end = pRootOfTree;
}
pRootOfTree = pRootOfTree.right;
}
return head;
}