第36题 二叉搜索树和双向链表

题目描述

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

解题思路

  • 二叉搜索树的中序遍历结果就是排好序的,所以二叉搜索树转换成排好序的双向 链表是可以实现的。
  1. 把二叉搜索树划分为三个部分:左子树,根节点,右子树;(划分为三个部分)
  2. 这三个部分中每个部分都是排好序的,所以我们考虑的是怎么连接的问题,也就是寻找排好序的链表中的最后一个结点的问题;(寻找最后一个结点进行连接)
  3. 左子树和右子树上递归调用上述两步。

代码

public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        //定义排好序的链表中最后一个结点
        TreeNode lastNodeList=null;
        
        lastNodeList=ConvertNode(pRootOfTree,lastNodeList);
       
        //需要返回头结点
        while(lastNodeList!=null && lastNodeList.left!=null){
            lastNodeList=lastNodeList.left;
        }
        return lastNodeList;
    }
    
    //左子树,根节点和右子树排好序的链表中最后一个结点
    public TreeNode ConvertNode(TreeNode pRootOfTree,TreeNode lastNodeList){
        if(pRootOfTree==null){
            return null;
        }
        
        TreeNode current=pRootOfTree;
        if(current.left!=null){
            lastNodeList=ConvertNode(current.left,lastNodeList);//排好序的左子树上最后一个节点
        }
       
        current.left=lastNodeList;//根节点的左边是左子树上最后一个结点
        if(lastNodeList!=null){
            lastNodeList.right=current;//左子树上最后一个结点的下一个是根节点(左子树和根节点排好序了)
        }
        lastNodeList=current;//现在已经排好序的最后一个结点是根节点
       
        if(current.right!=null){
            lastNodeList=ConvertNode(current.right,lastNodeList);
        }//排右子树上的节点,返回链表的最后一个结点
        return lastNodeList;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值