/**************************************************
输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的节点,只能调整树中节点指针的指向。
***************************************************/
#include<stdio.h>
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
void PrintDoubleLinkedList(BinaryTreeNode* pHeadOfList)
{
BinaryTreeNode* pNode = pHeadOfList;
printf("The nodes from left to right are:\n");
while(pNode != NULL)
{
printf("%d\t", pNode->m_nValue);
if(pNode->m_pRight == NULL)
break;
pNode = pNode->m_pRight;
}
printf("\nThe nodes from right to left are:\n");
while(pNode != NULL)
{
printf("%d\t", pNode->m_nValue);
if(pNode->m_pLeft == NULL)
break;
pNode = pNode->m_pLeft;
}
printf("\n");
}
BinaryTreeNode* CreateBinaryTreeNode(int value)
{
BinaryTreeNode* pNode = new BinaryTreeNode();
pNode->m_nValue = value;
pNode->m_pLeft = NULL;
pNode->m_pRight = NULL;
return pNode;
}
void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
{
if(pParent != NULL)
{
pParent->m_pLeft = pLeft;
pParent->m_pRight = pRight;
}
}
void convertNode(BinaryTreeNode* pNode,BinaryTreeNode** pLastNodeInList);
BinaryTreeNode* convertBSTtoBinaryList(BinaryTreeNode* pRoot)
{
BinaryTreeNode* pLastNodeInList = NULL; //指向已经转换好的链表的最后一个节点(也是最大值)
convertNode(pRoot,&pLastNodeInList);
//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);
}
void test()
{
BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
BinaryTreeNode* pNode14 = CreateBinaryTreeNode(14);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);
BinaryTreeNode* pNode16 = CreateBinaryTreeNode(16);
ConnectTreeNodes(pNode10, pNode6, pNode14);
ConnectTreeNodes(pNode6, pNode4, pNode8);
ConnectTreeNodes(pNode14, pNode12, pNode16);
BinaryTreeNode* pHeadOfList = convertBSTtoBinaryList(pNode10);
PrintDoubleLinkedList(pHeadOfList);
}
int main()
{
test();
return 0;
}
根节点、左子树和右子树。在把左子树、右子树都转换成排序的双向链表之后再和根节点连接起来,整棵二叉搜索树也就转换成了排序的双向链表。
参考剑指offer
分享到:
相关推荐
二叉搜索树与双向链表01
二叉搜索树与双向链表.md
二叉搜索树 转为 双向链表, 导入eclipse时要改包名package classOne; BST To Double LinkedList change package name,
java基础面试题二叉搜索树与双向链表本资源系百度网盘分享地址
剑指 Offer 36. 二叉搜索树与双向链表题解写的比我的简单面试题36. 二叉搜索树与双向链表(中序遍历,清晰图解)
36. 二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。解题思路private TreeNode pre = null;
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 包含二叉树的建立,测试输出。。可直接运行。。
这个是某公司的一道题,是把二叉查找树 转为双向链表的,我用程序实现了。希望对你有帮助!
本文实例讲述了Python二叉搜索树与双向链表转换算法。分享给大家供大家参考,具体如下: 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的...
对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为...
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。然后是中序递归遍历,先递归左子树,然后递归到最左的结点,然后赋值为head,tail表示上一个结点。
对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素
本文实例讲述了Python二叉搜索树与双向链表实现方法。分享给大家供大家参考,具体如下: # encoding=utf8 ''' 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求不能创建任何新的结点,...
实现思路如下图所示:* 1)假设当前遍历的结点为root,root的左子树已经被转换为双向链表(如下图(1)所示)* 2)使用两个变量pHead与pEnd分别指
# Python实现《剑指offer》 部分代码自己添加了一些测试用例, 或者自己添加了一些功能 1. 初级程序员注重算法和数据结构 2. 事先做好准备,对工作有热情 3. 面试过程放松。不要急于写代码,了解清楚所要解决的问题,...
难度:中等 一、题目描述: 二、解题分析: class Solution: def __init__(self): ... # 二叉搜索树的中序遍历是递增的,因此把标准中序遍历中 改变每个父节点的左右指向即可 # head, pre, tail = None,None,None #