[算法练习-剑指offer]题26.二叉搜索树与双向链表(Java)(存疑)

题目

题号:26
题目名:二叉搜索树与双向链表

编程语言

Java

题目描述

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

初次思路

二叉搜索树的中序遍历就是递增的

中序遍历是,左根右的遍历

那么只要把二叉搜索树进行递归,然后重构一个双向链表就行

重点有:在遍历的时候要将前置结点连向当前结点,当前节点的前驱连向前置结点,然后再将前驱后移,换下一个结点

这里有一个疑惑?双向链表不是要头结点前驱连向尾巴结点,尾巴结点后继连向头结点???为什么写进去以后就会死循环??不知道是不是我写错了,扔进去力扣试了下是对的,但是牛客会一直说内存溢出,这个有待商榷.

        //中序遍历完以后,pre指针会指向链表末尾,也就是最大的数,也就是树的最右下的结点(牛客不用连????)
        //pre.right = head;//尾节点后继指向头结点
        //head.left = pre;//右节点前驱指向尾节点

解题代码

public class Solution {
    TreeNode pre = null;//设置前驱
    TreeNode head = null;//设置头结点

    public TreeNode Convert(TreeNode pRootOfTree) {
        /**
         * 1.中序遍历二叉搜索树
         * 2.给每个节点连接前后关系,头结点前驱是尾巴,尾节点后继是头
         */
        //非空校验
        if (pRootOfTree == null) return null;
        dfs(pRootOfTree);//对二叉搜索树进行中序遍历
        //中序遍历完以后,pre指针会指向链表末尾,也就是最大的数,也就是树的最右下的结点(牛客不用连????)
        //pre.right = head;//尾节点后继指向头结点
        //head.left = pre;//右节点前驱指向尾节点
        return head;
    }
    //左  根   右进行中序遍历
    private void dfs(TreeNode root) {
        if (root == null) return;
        dfs(root.left);//先遍历左左子树
        if (pre == null) {
            head = root;//如果前驱没有指向,说明还在头结点遍历
            pre = root;//如果前驱没有指向,说明还在头结点遍历
        }
        else {
            pre.right = root;//否则,当前结点是前驱结点的后继
            root.left = pre;//因为是双向链表,当前结点的前驱要有指向
            pre = root;//处理完当前结点,就将前驱结点后移
        }
        dfs(root.right);//处理右子树
    }
}

算法练习代码我都开源在码云上,有需要的朋友可以看看

https://gitee.com/xiaoxiaoyuworkspace/offeralgorithm

猜你喜欢

转载自blog.csdn.net/qq_41522089/article/details/107624776
今日推荐