一、题目链接
二叉搜索树与双向链表
题目描述:将一颗二叉搜索树变成一个有序的双向链表。
二、解题思路
三、解题代码
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
// 4 6 8 10 12 14 16
public class Solution {
// 定义一个新结点,该结点用于记录中序遍历时每个结点的前驱结点,这个值会动态更新
TreeNode prev = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null){
return null;
}
inOrder(pRootOfTree);
TreeNode head = pRootOfTree;
// 因为中序遍历的规则为:左——> 根 ——> 右,因此中序遍历后所得的双向链表其头节点是在左子树处,因此循环当前节点的左子树,找到中序遍历后生成的双向链表的头结点
while(head.left != null){
head = head.left;
}
return head;
}
// 中序遍历:将二叉搜索树变成一个有序的双向链表
public void inOrder(TreeNode root){
if(root == null){
return;
}
inOrder(root.left);
// 当前结点的前驱是prev
root.left = prev;
// 如果prev此时为空,不执行当前代码行,避免空指针异常
if(prev != null){
// 当前结点的前驱是prev,那么说明prev的后继就是当前结点root
prev.right = root;
}
// 走到这里,已经确定了当前结点的前驱、前驱结点的后继,此时就可以更新prev
prev = root;
inOrder(root.right);
}
}