您的位置:首页 > 编程语言

【编程题目】把二元查找树转变成排序的双向链表(树)

2014-08-04 16:16 489 查看
1.把二元查找树转变成排序的双向链表(树)
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};

我的思路:找到最小元素做头结点,不断的找其后继,调整指针的指向。写了一个半小时!

template<typename T>
struct TreeNode
{
T data;
TreeNode* pLChild;
TreeNode* pRChild;
};

// 要求两个输出参数要初始化为NULL
template<typename T>
void ConvertBSTree2List(TreeNode<T>* pTreeRoot/*树的根节点*/, TreeNode<T>*& pListHead/*双向链表的头指针*/, TreeNode<T>*& pListLast/*双向链表的尾指针*/)
{
if(pTreeRoot == NULL)
{
return;
}

// 中序遍历左子树
ConvertBSTree2List(pTreeRoot->pLChild, pListHead, pListLast);

// 处理当前节点,把节点链到双向链表尾部

// 修改当前节点左指针,指向双向链表尾部
pTreeRoot->pLChild = pListLast;
if(pListLast)        // 非第一个节点
{
pListLast->pRChild = pTreeRoot;
}
else                // 第一个节点
{
pListHead = pTreeRoot;
}

pListLast = pTreeRoot;

// 中序遍历右子树
ConvertBSTree2List(pTreeRoot->pRChild, pListHead, pListLast);
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: