二叉搜索树与双向链表

二叉搜索树与双向链表

http://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5

(不开辟新的存储空间来完成二叉排序树向双向链表的转换)
大致思路:在中序遍历的过程中对每个节点的指针进行操作:完成对二叉排序树中元素从小到大的排序并且对每个遍历到的节点的指针进行修改。 **
** 借助一个指针指向每次遍历到的节点,下一次中序遍历到的节点的前驱便是此指针指向的节点,而此节点的后序是此时遍历到的节点。**
特点:此方法无需开辟新的数组空间来存储二叉排序树的元素顺序,可以在一次中序遍历完成后将二叉排序树改变成双向链表
注意事项:链表中指向最后一个节点的指针,当使用递归,且需要用具体变量保存每次递归的结果时,不能把此变量作为递归函数的形参,因为每次递归返回时此变量都会变为上层递归时此变量的值。所以这里的变量不作为inOrderConvert()的形式参数,而又由于在两个方法中都用到了此变量,所以将其定义在了所有方法的外面。

    TreeNode lastNodeList = null;
    /**
     * @Author: ZwZ
     * @Description: 在中序遍历过程中对指针进行改变 
     * @Param: [pRootOfTree] 
     * @return: jianZhi.TreeNode 
     * @Date: 2020/1/27-16:19
     */
    public TreeNode Convert1(TreeNode pRootOfTree) {
        inOrderConvert(pRootOfTree);
        //寻找链表头节点
        while (lastNodeList != null && lastNodeList.left != null)
            lastNodeList = lastNodeList.left;
        return lastNodeList;
    }
    /**
     * @Author: ZwZ
     * @Description: 中序遍历并改变指针
     * @Param: [root] 
     * @return: void 
     * @Date: 2020/1/27-16:22
     */
    public void inOrderConvert(TreeNode root) {
        if (root == null)
            return;
        if (root != null) {
            inOrderConvert(root.left);
            root.left = lastNodeList;
            if (lastNodeList != null)
                lastNodeList.right = root;
            lastNodeList = root;
            inOrderConvert(root.right);
        }
    }
全部评论
牛逼!!,不过最后可以再做点小优化:找头节点,可以用pRootOfTree,一直往left找,就不用从最后一个lastNodeList的left开始找。
2 回复 分享
发布于 2020-02-17 22:12
不行?
点赞 回复 分享
发布于 2020-03-11 23:24
不用指针不会改变值吧
点赞 回复 分享
发布于 2020-06-02 22:27

相关推荐

和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
33 3 评论
分享
牛客网
牛客企业服务