剑指offer—36.二叉搜索树与双向链表—分析及代码(Java)

剑指offer——36.二叉搜索树与双向链表——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 递归分解
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

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

二、分析及代码

1. 递归分解

(1)思路

根据本题输入、输出结点的特点,可将问题分解为处理当前根结点与左、右子树转换后返回的双向链表头部结点的链接,通过递归实现全树转换。
每次递归过程中,可进一步分解为以下 5 个步骤:
1)若当前根结点为空,直接返回;
2)若当前根结点为叶子节点,返回其自身;
3)通过递归得到左子树转换后的双向链表头部结点,寻找其尾部结点并和当前根结点建立链接;
4)通过递归得到右子树转换后的双向链表头部结点,将其与当前根结点建立链接;
5)寻找并返回当前双向链表的头部结点。

(2)代码

public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        // 结点为空,直接返回
        if (pRootOfTree == null)
            return null;
        
        // 叶子结点,返回自身
        if (pRootOfTree.left == null && pRootOfTree.right == null)
            return pRootOfTree;
        
        // 链接左子树
        if (pRootOfTree.left != null) {
            TreeNode leftNode = Convert(pRootOfTree.left);
            while (leftNode.right != null)
                leftNode = leftNode.right;
            leftNode.right = pRootOfTree;
            pRootOfTree.left = leftNode;
        }
        
        // 链接右子树
        if (pRootOfTree.right != null) {
            TreeNode rightNode = Convert(pRootOfTree.right);
            rightNode.left = pRootOfTree;
            pRootOfTree.right = rightNode;
        }
        
        // 返回链表头结点
        TreeNode head = pRootOfTree;
        while (head != null && head.left != null)
            head = head.left;
        return head;
    }
}

(3)结果

运行时间:14ms,占用内存:9404k。

三、其他

暂无。

你可能感兴趣的:(数据结构与算法)