剑指offer (27) 二叉搜索树和双向链表

题目:输入一棵BST,将该BST转换成一个排序的双向链表

要求不能创建新的结点,只能调整树中结点指针的指向

在BST中,左子节点的值 小于父节点的之, 父节点的值小于 右子节点的值

因此我们在转换成有序的双向链表时,原先指向左子节点的指针调整为链表中指向前一个结点的指针

原先指向右子节点的指针调整为链表中指向后一个结点的指针

很自然的想到对BST进行中序遍历

当我们遍历转换到根节点(值为10的结点)时,它的左子树已经转换成 一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点

我们把值为8的结点和根节点连接起来,并设置当前值最大的结点更新为10

void ConvertNode(BinTreeNode* pNode, BinTreeNode** pLastInList)
{
    if (pNode == NULL) return;

    BinTreeNode* pCurrent = pNode;
    if (pCurrent->m_pLeft != NULL) {
        ConvertNode(pCurrent->m_pLeft, pLastInList);
    }
    pCurrent->m_pLeft = *pLastInList;   // 设置根节点的left指针
    if (*pLastInList != NULL) {
        (*pLastInList)->m_pRight = pCurrent;  // 设置指向根节点的right指针
    }

    *pLastInList = pCurrent;
    if (pCurrent->m_pRight != NULL) {
        ConvertNode(pCurrent->m_pRight, pLastInList);
    }
}

我们用pLastInList指向已经转换好的链表的最后一个结点(也是值最大的结点),当我们遍历到值为10的结点,它的左子树已经转换好了,因此pLastInList指向值为8的结点

接着把根节点链接到链表中之后,值为10的结点成了链表中最后一个结点(新的值最大的结点),于是pLastInList指向这个值为10的结点

因为最后求出的pLastInList指向双向链表的最后一个结点,我们反向遍历,返回指向双向链表的头结点指针

BinTreeNode* Convert(BinTreeNode* pRoot)
{
    BinTreeNode* pLastInList = NULL;
    ConvertNode(pRoot, &pLastInList);

    BinTreeNode* pHeadList = pLastInList;
    while (pHeadList != NULL && pHeadList->m_pLeft != NULL) {
        pHeadList = pHeadList->m_pLeft;
    }
    return pHeadList;
}

剑指offer (27) 二叉搜索树和双向链表

时间: 2024-10-26 01:38:50

剑指offer (27) 二叉搜索树和双向链表的相关文章

剑指offer 27二叉搜索树与双向链表

class Solution { public: void ConvertNode(TreeNode* pRootOfTree,TreeNode** pre) { if(pRootOfTree) { TreeNode* cur=pRootOfTree; if(cur->left) ConvertNode(cur->left,pre); cur->left=*pre; if(*pre) (*pre)->right=cur; *pre=cur; if(cur->right) Co

剑指OFFER之二叉搜索树与双向链表(九度OJ1503)

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果. 样例输入: 1 2 1 0 0 3 0 0 样例输出: 1 2 3 解题思路

【剑指offer】二叉搜索树转双向链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26623795 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成

【剑指offer】二叉搜索树转双向链表,C++实现

原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.要求不能创建任何新的节点,只能调整树中节点指针的指向. 二叉树节点的定义 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NU

【Java】 剑指offer(36) 二叉搜索树与双向链表

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 二叉搜索树.排序链表,想到使用中序遍历. 要实现双向链表,必须知道当前结点的前一个结点.根据中序遍历可以知道,当遍历到根结点的时候,左子树已经转化成了一个排序的链表了,根结点的前一结点就是该链表的最后一个结点(这个结点必须记录下来,将遍历函数的返回值设置

剑指offer:二叉搜索树与双向链表

1.题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2.解题思路: (1)将左子树构造成双向链表,并返回链表头节点: (2)定位左子树双链表的尾节点: (3)如果左子树链表不为空,将当前root连缀其链尾: (4)将右子树构造出双向链表,并返回链表头节点: (5)如果右子树链表不为空,将当前root连缀其表头: (6)根据左子树链表是否为空,确定返回的节点. 3.JavaScript实现: function Conv

剑指Offer之二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 基本思路 假设二叉搜索树为{10,6,14,4,8,12,16},按照中序遍历,当我们遍历转换到根节点(值为10的节点)时,它的左子树已经转换成一个排序的链表了,并且处在链表的最后一个节点是当前最大的节点.我们把值为8的节点和根节点链接起来,此时链表中的最后一个节点就是10了.接着我们去遍历转换右子树,并把根节点和右子树的最小的节点链接起来.转换左子树和右子树,使用递归的

【剑指Offer】二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 算法描述 使用递归,分别去将当前节点的左右子树变成双向链表,然后获取左边链表的最后一个元素,当前元素的左指针指向它,它的右指针指向当前元素:右边链表的第一个元素,它的左指针指向当前元素,当前元素的右指针指向它:然后从当前元素开始,不断从左边找,找到第一个元素,返回此元素的指针. 总结: 对这种涉及到二叉树的题目,可以使用测试驱动开始,先写测试用例,然后再编码. 代码实现

剑指Offer 26. 二叉搜索树与双向链表 (二叉搜索树)

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目地址 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking