37.二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
- 需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。

数据范围:
树中节点数量 [0,500]。
代码:
//4 6 8 10 12 14 16
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//pre指针用于记录当前节点的前驱节点
TreeNode pre = null;
//head指针用于记录双向链表的头节点
TreeNode head = null;
public TreeNode convert(TreeNode root) {
//如果树为空,直接返回null
if(root == null)return null;
//中序遍历
dfs(root);
//返回双向链表的头节点
return head;
}
public void dfs(TreeNode cur){
//递归终止条件
if(cur == null)return;
//遍历左子树
dfs(cur.left);
//如果pre为空,说明这是最左下的节点,即链表的头节点
if(pre==null)head = cur;
else{
//前驱节点的右指针指向当前节点
pre.right = cur;
//当前节点的左指针指向当前节点
cur.left = pre;
}
//更新pre为当前节点,为下一次连接做准备
pre = cur;
//递归右子树
dfs(cur.right);
}
}

浙公网安备 33010602011771号