二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
输入:”10,6,14,4,8,12,16”
输出:从左往右读是”4,6,8,10,12,14,16”,从右往左读是”16,14,12,10,8,6,4”
思路:主要利用非递归的中序遍历的方式,将二叉搜索树进行中序遍历
那么,此时,二叉搜索树就成为一个排序后的节点了,再将它们链接起来即可。
/*
题目:非递归的中序遍历
思路:利用栈的数据结构,将左边的节点依次存入栈中,利用栈的先进后出方法,将该最左边的节点输出后,
再判断该节点是否有右子数,有的话,继续上面操作,依次输出即可。
代码如下:
*/
while (pNode != NULL || !treeStack.empty()) {
while (pNode != NULL) {
treeStack.push(pNode);
pNode = pNode->left;
}
if (!treeStack.empty()) {
pNode = treeStack.top();
treeStack.pop();
cout<<"输出该节点的信息为:"<<pNode->val;
pNode = pNode->right;
}
}
/*
题目:二叉搜索树与双向链表
*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if (pRootOfTree == NULL) {
return pRootOfTree;
}
stack<TreeNode*> treeStack;
TreeNode* pNode = pRootOfTree;
bool isFirst = true;
TreeNode* head;
TreeNode* pPre = NULL;
//非递归的中序遍历
while (pNode != NULL || !treeStack.empty()) {
while (pNode != NULL) {
treeStack.push(pNode);
pNode = pNode->left;
}
if (!treeStack.empty()) {
pNode = treeStack.top();
treeStack.pop();
if (isFirst) {
head = pNode;
pPre = pNode;
isFirst = false;
}
else {
pNode->left = pPre;
pPre->right = pNode;
pPre = pNode;
}
pNode = pNode->right;
}
}
return head;
}
};