二叉树系列 -Js实现将二叉搜索树转化为双向链表

剑指Offer题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

首先我们看一下将二叉搜索树转化为双向链表后的样子:
二叉树系列 -Js实现将二叉搜索树转化为双向链表_第1张图片
不难发现其实就是二叉树的中序遍历
要意识到查找二叉树转为排序列表其实只要对排序二叉树中序遍历,(查找二叉树的左子树的节点都小于根,右子树的节点都大于根);
所以可以利用栈进行非递归的遍历
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;
}

你可能感兴趣的:(js写算法)