美文网首页
27 二叉搜索树与双向链表(二叉树的线索化)

27 二叉搜索树与双向链表(二叉树的线索化)

作者: Juge100 | 来源:发表于2018-10-19 18:07 被阅读0次

二叉搜索树与双向链表

题目描述:

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

解题思路:

  1. 这道题目本质上就是BST的线索化,具体的操作步骤如下:
  2. 线索化根结点的左子树
  3. 将左子树的尾节点指向根结点
  4. 线索化根结点的右子树
  5. 将根结点指向右子树的头结点
  6. 若有左子树,则返回左子树的头结点;若没有,则返回根结点

代码:

class Solution{
public:
    TreeNode* Convert(TreeNode *root) {
        if (root == nullptr) 
            return nullptr;
        // 如果root为叶子结点,没有左右子树
        // 则返回root本身
        if (root->left == nullptr && root->right == nullptr) 
            return root;

        TreeNode *leftHead = nullptr, *leftNode = nullptr;
        TreeNode *rightHead = nullptr;
        // 如果左子树不为空,则线索化左子树
        if (root->left != nullptr) {
            leftHead = Convert(root->left);
        }
        // 找到左子树的尾节点
        leftNode = leftHead;
        while (leftNode != nullptr && leftNode->right != nullptr) {
            leftNode = leftNode->right;
        }
        // 将尾节点的右指针指向root结点
        // 将root结点的左指针指向leftTail
        // 在这里leftNode已经等于leftTail
        if (leftNode != nullptr) {
            leftNode->right = root;
            root->left = leftNode;
        }
        // 线索化右子树
        if (root->right != nullptr) {
            rightHead = Convert(root->right);
        }
        // 将root的右指针指向rightHead
        // 将rightHead的左指针指向root
        if (rightHead != nullptr) {
            root->right = rightHead;
            rightHead->left = root;
        }

        // 如果左子树不为空,返回leftHead
        // 如果左子树为空树,则返回root
        return leftHead == nullptr ? root : leftHead;
    }
};

2018.10.19

相关文章

  • 69_二叉树的线索化实现

    关键词:二叉树的额线索化 0. 什么是线索化二叉树? 将二叉树转换为双向链表的过程(非线性==》线性) 能够反映某...

  • 剑指Offer二

    27.二叉搜索树与双向链表 将二叉搜索树转换成一个排序的双链表,利用二叉搜索树的特性,非空二叉树的左子树上的节点的...

  • JavaScript数据结构11——线索二叉树的遍历

    线索二叉树包括了 将一个二叉树转为线索二叉树 建立一个头结点,形成循环双向链表 遍历二叉树 控制台输出 当前到达节...

  • 数据结构题目52:二叉树的线索化

    题目:二叉树的线索化对二叉树的线索化,就是把二叉树的二叉链表存储结构中结点的所有空指针域改造成指向某结点在某种遍历...

  • 二叉树

    二叉树 二叉搜索树与双向链表 「栈实现中序遍历」 树的子结构 判断B是不是A的子结构 二叉树的最近公共祖先 后序遍...

  • Day14 二叉树的最近公共祖先+二叉搜索树与双向链表+二叉搜索

    TODO:1.重做二叉树的最近公共祖先2.重做二叉搜索树与双向链表3.二叉搜索树的后序遍历序列,的辅助单调栈方法⭐...

  • 二叉树基础

    二叉树的分类 完全二叉树与满二叉树 二叉搜索树BST 平衡二叉搜索树BBST因为二叉搜索树有可能退化为链表,降低查...

  • 27 二叉搜索树与双向链表(二叉树的线索化)

    二叉搜索树与双向链表 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的...

  • 剑指offer.C++.code26-30

    26. 二叉搜索树与双向链表【分治法】 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任...

  • 面试题36. 二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新...

网友评论

      本文标题:27 二叉搜索树与双向链表(二叉树的线索化)

      本文链接:https://www.haomeiwen.com/subject/sbjuzftx.html