题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
输出输出样例
输入二叉搜索树:
输出双向链表:
题解
二叉搜索树的特性:中序遍历 left -> root -> right
的结果序列是排序好的。
所以使用中序遍历的递归方式,定义一个 root和 prev节点。
- root 表示返回的双向链表的头节点
- prev 表示每次递归返回的时候,上一次递归的节点
这样,每次将 prev
和 当前节点 node
建立起连接,并移动prev的位置。
因而,中序遍历出来有序的节点,然后将每一个节点和上一次的遍历结果连接起来,这样得到了一个有序的双向链表。
代码:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode root = null;
TreeNode prev = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null) return null;
helper(pRootOfTree);
// 将双向链表的首尾相连。这里leetcode和nowcoder中的要求不一样,nowcoder不要求首尾相连
// root.left = prev;
//prev.right = root;
return root;
}
// 使用中序遍历的方式遍历 BST,这样得到的顺序是排序好了的
public void helper(TreeNode node){
if(node == null) return;
helper(node.left);
// 如果是第一次遍历到最左边,那么此时prev=null,则此时的节点是双向链表的头节点
if(prev == null)
root = node;
else{
// 将上一个遍历的链表和当前链表拼接
prev.right = node;
node.left = prev;
}
prev = node;
helper(node.right);
}
}