面试题36:二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
思路:
- 在二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,分别指向前一个节点和后一个节点。由于这两种节点的结构也相似,因此,在理论上,有可能实现二叉搜索树和排序双向链表的转换。
- 在搜索二叉树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值。因此,我们在将二叉搜索树转化成排序双向链表时,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的值调整为链表中指向后一个节点的指针。
- 我们采用中序遍历的方法来递归地遍历二叉搜素树,这样遍历的顺序刚好是有序的。我们还需要定义一个 pre 指针,用来指向遍历过程中的上一个指针。访问每个节点时,我们让 pre–>right = root, root–>left = pre 即可将二叉搜索树转换成双向链表。
代码实现:
package Question36;
import com.sun.source.tree.Tree;
public class T01 {
static TreeNode pre = null;
public static void main(String[] args) {
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
node4.left = node2;
node4.right = node5;
node2.left = node1;
node2.right = node3;
solve(node4);
System.out.println("123");
}
public static void solve(TreeNode root) {
if(root != null) {
if(root.left != null) solve(root.left);
root.left = pre;
if(pre != null) pre.right = root;
pre = root;
if(root.right != null) solve(root.right);
}
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}