剑指offer:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
分析:中序遍历并将遍历顺序的结点存起来,最后遍历添加每个指针的前后指针域即可。
vector<TreeNode*> nodes;
//中序遍历(将结点指针尾插在vector中)
void tranverse(TreeNode* pRoot) {
if (nullptr == pRoot)
return;
tranverse(pRoot->left);
nodes.push_back(pRoot);
tranverse(pRoot->right);
}
//对vector中的结点添加指针指向
TreeNode* adjustTree() {
for (int i = 0; i < nodes.size() - 1; ++i)
{
nodes[i]->right = nodes[i+1];//后继
nodes[i+1]->left = nodes[i];//前驱
}
nodes[nodes.size()-1]->right = nullptr;//尾节点的next指针域为空
nodes[0]->left = nullptr;//头结点的pre指针域为空
return nodes[0];
}
TreeNode* Convert(TreeNode* pRoot)
{
if (nullptr == pRoot)
return nullptr;
tranverse(pRoot);
return adjustTree();
}