《编程之美》——二叉搜索树转换为排序双向链表

题目:
输入一棵二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求不能创建任何新的节点,只能调整树中指针的指向。

分析与解法:
这里写图片描述
1、由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。
2、由于中序遍历过程正好是转换成链表的过程,即可采用递归处理。
这里写图片描述

代码:

class TreeNode
{
    int val;
    TreeNode left = null;
    TreeNode right = null;
    TreeNode(int val)
    {
        this.val = val;
    }
}

public class Solution 
{
    TreeNode convertNode(TreeNode pNode, TreeNode pLastNodeInList)
    {
        if(pNode == null)
            return;
        TreeNode pCurrent = pNode;

        //递归处理左子树
        if(pCurrent.left != null)
            pLastNodeInList = convertNode(pNode.left, pLastNodeInList);

        //处理当前节点
        //将当前节点的左指针指向已经转换好的链表的最后一个位置
        pCurrent.left = pLastNodeInList;
        //将已经转换好的链表的最后一个节点的右指针指向当前节点
        if(pLastNodeInList != null)
            pLastNodeInList.right = pCurrent;
        //更新已经转换好的链表的最后一个节点
        pLastNodeInList = pCurrent;

        //递归处理右子树
        if(pCurrent.right != null)
            pLastNodeInList = convertNode(pNode.right, pLastNodeInList);
        return pLastNodeInList;
    }

    TreeNode convert(TreeNode pRoot)
    {
        if(pRoot == null)
            return null;

        //处理二叉搜索树
        TreeNode pLastNodeInList = null;
        pLastNodeInList = convertNode(pRoot, pLastNodeInList);

        //找到转换后的链表的头节点
        TreeNode pHead = pLastNodeInList ;
        while(pLastNodeInList != null && pLastNodeInList.left != null)
            pHead = pHead.left;

        //返回头节点
        return pHead;
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值