考点:二叉搜索树、中序遍历、双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。如图一个二叉树转换成排序的双向链表
思路分析
在搜索二叉树中,左节点的值总小于父节点,右节点的值总大于父节点;按中序遍历树的节点,得到的序列刚好是从小到大有序的。二叉树有两个指向子节点的指针,双向链表也是两个指针,一个向前,一个向后;把二叉树转换成双向链表时,原先指向左节点的指针指向链表中的前一个节点,原先指向右节点的指针指向链表中的后一个节点。
具体思路:
1.先中序遍历二叉搜索树,将结果放入数组中
2.再将数组转换为双向链表
上图中序遍历后序列为{4,6,8,10,12,14,16},存在容器vector list中,list是结点类型的。再修改指针连接即可。
实现代码
class Solution {
public:
//中序遍历
void mid(TreeNode* pRootOfTree,vector<TreeNode*> &list)
{
if(pRootOfTree==NULL)
return;
if(pRootOfTree->left!=NULL)
mid(pRootOfTree->left,list);
list.push_back(pRootOfTree);
if(pRootOfTree->right!=NULL)
mid(pRootOfTree->right,list);
}
//修改指针连接
TreeNode* Convert_p(vector<TreeNode*> list)
{
for(int i=0;i<list.size()-1;i++){
list[i]->right=list[i+1];
list[i+1]->left=list[i];
}
return list[0];
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL)
return NULL;
mid(pRootOfTree,list);
return Convert_p(list);
}
private:
vector<TreeNode*> list;
};