题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

<?php
/*class TreeNode{
    var $val;
    var $left = NULL;
    var $right = NULL;
    function __construct($val){
        $this->val = $val;
    }
}*/
function Convert($pRootOfTree)
{
    if($pRootOfTree == null){
        return null;
    }
    $pre = null;
    inOrder($pRootOfTree, $pre);
    $ret = $pRootOfTree;
    while($ret != null && $ret->left != null){
        $ret = $ret->left;
    }
    return $ret;
}

// 中序遍历
function inOrder($root, &$prev){
    if($root==null){
        return;
    }
    inOrder($root->left, $prev);
    // 当前左边指向上一个
    $root->left = $prev;
    // 上一个的右边指向当前
    if($prev != null){
        $prev->right = $root;
    }
    $prev = $root;
    inOrder($root->right, $prev);
}

二叉搜索树:左边不空的话,左边的节点全<根,右边不空的话,右边的全大于根

最适用于:中序遍历

原理:每个节点的left指向上一个,right指向下一个

方法:递归中序遍历,维护一个prev指针记录上个节点。注意:prev需要传实参才能记录真实的上一个节点。

inOrder(root->left,prev);

curr->left指向左

prev->right指向右(代替curr->right指向next,因为我们不知道下一个是什么,还没有遍历到)

prev移动到curr

inOrder(root->right, prev)

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务