二叉排序树转为双向链表
题目
输入一棵排序二叉树,将此树转换成一个排序的双向链表,要求不能创建任何新的借点,只能调整指针的指向.
分析
二叉排序树的中序遍历可以得到它的排序元素,但是,但是“它不能创建任何新的节点,只能调整指针的指向”,所以,直接中序法就不可行了。
大致思路是如下的:
- 如果当前根节点的左子树不为空,则
- 递归左子树
- 查找左子树最大的元素
- 将该元素的
right
指针指向根节点,将根节点的left
指针指向该元素
- 如果当前根节点的右子树不为空,则
- 递归右子树
- 查找右子树最小的元素
- 将该元素的
left
指针指向根节点,将根节点的right
指针指向该元素
注:
tree
的left
和right
结构正好对应list
的pre
和next
结构
8
/ \
3 10
/ \ \
1 6 14
/ \ /
4 7 13
它依次调整的点为:1(l),4(l),7(r),4(r),7(l),13(l),13(r),10(r)
8
/ \
1-3 10
\ \
6 14
/ \ /
4 7 13
1为3左子树的最大点,所以的右指针指向3,3的左指针指向1
8
/ \
1-3 10
\ \
4-6 14
\ /
7 13
4为6的左子树的最大值,所以4的右指针指向6,6左指针4
8
/ \
1-3 10
\ \
4-6-7 14
/
13
7为6的右子树的最小值,所以7的左指针指向6,6右指针4
8
/ \
1-3 10
\ \
4-6-7 14
/
13
4为3的右子树的最小值,所以4的左指针指向3,3右指针4
1-3-4-6-7-8
\
10
\
14
/
13
7为8左子树的最小值,所以7的右指针指向8,8的左指针指向7
这样就完成了根节点左边的转换,右边的转换思路一致
代码实现
1 | /** |
具体实验代码
1 | public static void main(String[] args) { |
关于二叉排序树具体介绍看我之前的二叉排序树
本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言。