二叉搜索树的性质:
1. 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同, key值不可改。
2. 左子树上所有节点的关键码(key)都小于根节点的关键码(key)。
3. 右子树上所有节点的关键码(key)都大于根节点的关键码(key)。
4. 左右子树都是二叉搜索树。
思路:根据搜索二叉树的性质,我们可以得知,当中序遍历它是有序的。
因此如果对树进行中序线索化,使它的每一个节点left指针指向它的前驱,right指针指向它的后继。
这是一颗搜索二叉树:
它转成双向链表后的图为:
蓝色代表当前节点的前驱,红色代表当前节点的后继。
代码:
Node* TreeToList()
{
if(_root==NULL)
return NULL;
Node* prev=NULL;
_ToList(_root,prev);
while(_root->_left )
{
_root=_root->_left ;
}
return _root;
}
void _ToList(Node* root,Node*& prev)
{
if(root==NULL)
return;
_ToList(root->_left ,prev);
root->_left=prev;
if(prev)
{
prev->_right =root;
}
prev=root;
_ToList(root->_right ,prev);
}