题目:
输入一颗二叉搜素树,将该树转换成一个排序的双向链表.要求不能创建新的结点,只能
调整树中结点指针的指向.
思想:
10
/ \
6 4---------------->4==6==8==10==12==14==16
/\ /\
4 8 12 16
我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。
如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,
我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,
整棵树也就转换成一个排序双向链表了。
#include<stdio.h>
#include<stdlib.h>
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
} ;
struct ListNode
{
int m_nValue;
ListNode* pNext;
};
void convertNode(BinaryTreeNode*,BinaryTreeNode**);
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);
}
BinaryTreeNode* createTree(BinaryTreeNode* pRoot)
{
int data;
scanf("%d",&data);
if(data!=-1)
{
pRoot=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
if(pRoot==NULL)
exit(0);
pRoot->m_nValue=data;
pRoot->m_pLeft=createTree(pRoot->m_pLeft);
pRoot->m_pRight=createTree(pRoot->m_pRight);
return pRoot;
}
return NULL;
}
void printNode(BinaryTreeNode* pTree)
{
if(pTree==NULL)
return;
if(pTree->m_pRight!=NULL)
{
printf("%d\t",pTree->m_nValue);
pTree=pTree->m_pRight;
printNode(pTree);
}
else
printf("%d",pTree->m_nValue);
}
int main()
{
int num;
while(scanf("%d",&num)!=EOF)
{
BinaryTreeNode* pNode;
BinaryTreeNode* pTree=createTree(pNode);
BinaryTreeNode* pList = convert(pTree);
printNode(pList);
}
return 0;
}
结果见上
分享到:
相关推荐
这个是某公司的一道题,是把二叉查找树 转为双向链表的,我用程序实现了。希望对你有帮助!
而将一个二叉搜索树转换为双向链表,可以进一步优化某些操作,如顺序遍历,因为链表提供了连续的访问方式。 双向链表(Doubly Linked List)是一种线性数据结构,其中每个节点包含数据和两个指针,分别指向其前一个...
而将一个二叉搜索树转换成一个排序的双向链表,则可以利用其天然的有序性,优化某些特定算法的实现,如在链表中进行连续操作。 题目“剑指offer”中的面试题27,就是关于这个转换过程。这个过程的核心在于如何通过...
二叉搜索树与双向链表.md
剑指 Offer 36. 二叉搜索树与双向链表题解写的比我的简单面试题36. 二叉搜索树与双向链表(中序遍历,清晰图解)
java基础面试题二叉搜索树与双向链表本资源系百度网盘分享地址
c++ c++_剑指offer题解之二叉搜索树与双向链表
在给定的题目中,我们需要将一个二叉搜索树转换为一个双向链表,同时保持原有的顺序关系。这个操作通常称为“中序遍历”转换,因为二叉搜索树的中序遍历序列是一个有序序列,这正是双向链表的特点。中序遍历的顺序是...
python python_剑指offer第26题二叉搜索树与双向链表
36. 二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。解题思路private TreeNode pre = null;
二叉排序树变成双向循环链表,二叉排序树变成双向循环链表,二叉排序树变成双向循环链表
在本题中,我们面临的任务是将一棵二叉搜索树转换为一个排序的循环双向链表。 双向链表(Doubly Linked List)是一种数据结构,其中每个节点包含两个指针,一个指向前一个节点(前驱),另一个指向后一个节点(后继...
本文实例讲述了Python二叉搜索树与双向链表转换算法。分享给大家供大家参考,具体如下: 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的...
二叉排序树(二叉链表、引用).cpp
对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。然后是中序递归遍历,先递归左子树,然后递归到最左的结点,然后赋值为head,tail表示上一个结点。
本题要求将一个二叉搜索树转换为一个排序的循环双向链表。在这个过程中,不能创建新的节点,只能调整树中已有的节点指针。 在双向链表中,每个节点都有两个指针,一个指向它的前驱节点(即顺序上位于其左侧的节点)...
用二叉链表作存储结构。 要求: (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,...
《剑指Offer》中的面试题36探讨了一个有趣的问题,即如何将一棵二叉搜索树转化为一个双向链表。这道题目主要考察了对二叉搜索树(BST)特性的理解以及链表操作的能力。 首先,我们要明确二叉搜索树的基本特性:对于...