37.二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

要求不能创建任何新的结点,只能调整树中结点指针的指向。

注意:

  • 需要返回双向链表最左侧的节点。

例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。

image

数据范围:

树中节点数量 [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);
    }
}
posted @ 2025-05-27 10:29  回忆、少年  阅读(15)  评论(0)    收藏  举报