剑指Offer题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
首先我们看一下将二叉搜索树转化为双向链表后的样子:
不难发现其实就是二叉树的中序遍历
要意识到查找二叉树转为排序列表其实只要对排序二叉树中序遍历,(查找二叉树的左子树的节点都小于根,右子树的节点都大于根);
所以可以利用栈进行非递归的遍历
1、先遍历左子树,直到左子树为空的时候,出栈,
2、对出栈元素重新设置该节点的left,right指针(按照中序遍历的顺序去设置left,right指针,上一个节点为上一个出栈的元素,没有时为空,下一个节点为下一个出栈的元素)(记得在Prev为空时设置当前节点为新的头节点)
3、访问该节点的右子树
4、在node不为空或stack不为空时循环执行上述操作
function Convert(node)
{
var stack = [];
var prev ;
var root ;
// write code here
while(node!= null||stack.length!=0){
while(node!=null){
stack.push(node);
node = node.left;
}
node = stack.pop();
if(!prev){
root = node;
node.left = null;
}else{
prev.right = node;
node.left = prev;
}
prev = node;
node = node.right;
}
return root;
}