剑指offer———JZ26、二叉搜索树与双向链表

题目描述

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

思路

  1. 中序遍历即可。只需要记录一个pre指针即可。pre和p一直后移操作。

  2. pre是p的先序节点,让pre的next指向p,p的front指向pre(代码中的root就是p)

  3. 找到重新生成的链表的头节点,即中序遍历的第一个节点。中序遍历的第一个节点一定是最左下的节点。当pRootOfTree有左子树的时候,pRootOfTree=pRootOfTree.left,再判断pRootOfTree有没有左子树,就不停的找左子树,找到一个点没有左子树,那他就是中序遍历的第一个节点,就是答案的头节点。

代码

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
 

//pre->p

let pre = null;
function Convert(pRootOfTree)
{
    pre = null;
    //如果根节点为空返回空就好
    if(pRootOfTree == null) return null;

    //中序遍历即可。只需要记录一个pre指针即可。
    inOrder(pRootOfTree);

    
    //找中序遍历的第一个节点为答案的头节点,中序遍历第一个节点是最坐下的节点,当pRootOfTree有左子树的时候,就不停的找左子树
    while(pRootOfTree && pRootOfTree.left){
        pRootOfTree = pRootOfTree.left;
    }
    return pRootOfTree;
     
}

function inOrder(root){
    if(root ==null) return;
    inOrder(root.left);

    //pre是root的先序节点,让pre的next指向root,root的front指向pre
    root.left = pre;
    if(pre!=null){
        pre.right = root;
    }
    //pre指针后移
    pre = root;

    inOrder(root.right);
}

运行环境:Javascript_V8

运行时间:10ms

占用内存:5292KB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值