二叉搜索树转化为排序双向链表。可以使用中序线索化的方法去进行,在这里需要注意的是我们需要一个记录前一个访问节点的结点。
二叉搜索树转换前:
转换后:
思路:如果根节点的左子树存在,则一直去访问左子树,当为空时返回,并将prev结点赋给该节点的左子树,如果prev不为空,则将prev结点的右子树指向该节点,无论prev是否存在,将该节点赋给prev,如果该节点的右子树存在,则继续转换为子问题。去解决。
注意:prev一定要传指针的地址,因为每一次递归都要确保改变其本身。
代码实现:
void BinaryTreeConvert(TreeNode* node, TreeNode** prev)//二叉搜索树转换为排序双向链表
{
if (node == NULL)
return;
if (node->_left)
BinaryTreeConvert(node->_left, prev);
node->_left = *prev;
if (*prev)
{
(*prev)->_right = node;
}
*prev = node;
if (node->_right)
BinaryTreeConvert(node->_right, prev);
}
测试用例:
void Text()
{
TreeNode* node = new TreeNode(1);
TreeNode* node1 = new TreeNode(2);
TreeNode* node2 = new TreeNode(3);
TreeNode* node3 = new TreeNode(4);
TreeNode* node4 = new TreeNode(5);
TreeNode* node5 = new TreeNode(6);
TreeNode* node6 = new TreeNode(7);
TreeNode* node7 = new TreeNode(8);
node->_left = node1;
node->_right = node2;
node1->_left = node3;
node3->_right = node4;
node3->_left = node5;
node5->_left = node6;
TreeNode* prev = NULL;
BinaryTreeConvert(node, &prev);
}