二叉搜索树与双向链表转换

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

struct BinaryTreeNode
{    
    int m_nValue;
    BinaryTreeNode* m_pLeft;
    BinaryTreeNode* m_pRight;
}

利用递归来解决问题

BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree)
{
    BinaryTreeNode* pLastNodeInList=NULL;
    ConvertNode(pRootOfTree,&pLastNodeInList);
    BinaryTreeNode *pHeadOfList=pLastNodeInList;
    while(pHeadOfList!=NULL&&pHeadOfList->m_pLeft!=NULL)
        pHeadOfList=pHeadOfList->m_pLeft;
    return pHeadOfList;
}

void ConvertNode(BinaryTreeNode* pNode,BinaryTreeNode** pLastNodeInList)
{
    if(pNode==NULL)
        return;
    
    BinaryTreeNode *pCurrent=pNode;
    if(pCurrent->m_pLeft!=NULL)
        ConvertNode(pCurrent->m_pLeft,pLastNodeInList);
        
    pCurrent->m_pLeft=*pLastNodeInList;
    if(*pLastNodeInList!=NULL)
        (*pLastNodeInList)->m_pRight=pCurrent;
    
    *pLastNodeInList=pCurrent;
    
    if(pCurrent->m_pRight!=NULL)
        ConvertNode(pCurrent->m_pRight,pLastNodeInList);
}
时间: 2024-08-26 00:22:53

二叉搜索树与双向链表转换的相关文章

二叉搜索树与双向链表的转换

题目:输入一棵二叉搜索树(记住是搜索树),将该二叉搜索树转换为一个排序的双向链表.要求:不能创建任何新的结点,只能调整树中结点指针的指向. 分析:如下图 因为是二叉搜索树.所以树的排列是规则的.通过中序遍历正好遍历的是由小到大的序列. 要求说明是只能改变树结点指针的指向,不能增加新的空间和结点.所以在中序遍历的时候,主要是遍历到结点后就去改变指针指向. 为了简单,采用递归进行遍历. 树的结构 struct BinaryTreeNode{ int m_data; BinaryTreeNode* m

编程算法 - 二叉搜索树 与 双向链表 代码(C++)

二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求不能创建不论什么新的结点, 仅仅能调整数中结点的指针的指向. 方法: 使用中序遍历每个结点, 并进行连接, 即左子树指前, 右子树指后, 并保存前一个节点. 本程序包括算法原理, 測试程序, 及 输出. /* * main.cpp * * Created on: 2014.6.12 * Author

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

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

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

二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 按中序遍历二叉搜索树可从小到大遍历元素 边遍历元素边创建双向链表 最后得到的双向链表的指针指向最后一个节点,所以需要再往回遍历一遍让指针指到头结点 代码 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tre

二叉搜索树与双向链表——27

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整树中结点指针的指向. 如上所示的二叉搜索树,转换成排序的双向链表就是5-><-6-><-7-><-8-><-9-><-10-><-11. 因为要求转换成双向链表,而恰好二叉树的每个结点都有两个指针,因此可以直接调整指针的指向:对于搜索二叉树,每个结点的左子树的值都比根结点的值要小,而每个右子树的值都比当前结点的值要大,而要求转换成排序的双向链

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

题目:输入一棵BST,将该BST转换成一个排序的双向链表 要求不能创建新的结点,只能调整树中结点指针的指向 在BST中,左子节点的值 小于父节点的之, 父节点的值小于 右子节点的值 因此我们在转换成有序的双向链表时,原先指向左子节点的指针调整为链表中指向前一个结点的指针 原先指向右子节点的指针调整为链表中指向后一个结点的指针 很自然的想到对BST进行中序遍历 当我们遍历转换到根节点(值为10的结点)时,它的左子树已经转换成 一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点 我们把

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

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

24.二叉搜索树与双向链表

二叉搜索树与双向链表 参与人数:2316时间限制:1秒空间限制:32768K 算法知识视频讲解 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. // 25.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(i

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

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