二叉搜索树转化为排序双向链表。可以使用中序线索化的方法去进行,在这里需要注意的是我们需要一个记录前一个访问节点的结点。
二叉搜索树转换前:
转换后:
思路:如果根节点的左子树存在,则一直去访问左子树,当为空时返回,并将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);
- }