【浅刷Java数据结构】二叉搜索树与双向链表

题目链接: 二叉搜索树与双向链表
在这里插入图片描述

思路1:

搜索二叉树转换成有序双向链表 = 左子树构建得双向有序链表+根节点+右子树构建得双向有序链表

用图分析:
在这里插入图片描述

代码:

public class Solution {
    public TreeNode CreateList(TreeNode pCur){
        if(pCur==null){
            return null;
        }
        TreeNode leftTree = CreateList(pCur.left);//将左子树创建为双向链表
        TreeNode rightTree = CreateList(pCur.right);//将左子树创建为双向链表
        
        if(leftTree!=null){
            while(leftTree.right!=null){//遍历找到左子树的最右边结点
                leftTree=leftTree.right;
            }
            leftTree.right=pCur;
            pCur.left=leftTree;
        }
        if(rightTree!=null){
            while(rightTree.left!=null){//遍历找到右子树最左边的结点
                rightTree=rightTree.left;
            }
            pCur.right=rightTree;
            rightTree.left=pCur;
        }
        return pCur;
    }
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null){
            return null;
        }
        CreateList(pRootOfTree);
        TreeNode head=pRootOfTree;
        while(head.left!=null){
            head=head.left;
        }
        return head;
    }
}

在这里可以看到,并没有刻意去控制链表的头和尾的null,那是因为一棵用二叉搜索树创建的链表的头节点的left尾节点的right自然而然是null

思路2:

引入一个变量prev,用来记录pCur的前一个结点。
遍历的过程是中序遍历:pCur的顺序是中序遍历的顺序,prev的顺序也是中序遍历得顺序。

public class Solution {
    TreeNode prev=null;//prev指向pCur的前一个结点
    public void CreateList(TreeNode pCur){
        if(pCur==null){
            return;
        }
        CreateList(pCur.left);
        pCur.left=prev;
        if(prev!=null){
            prev.right=pCur;
        }
        prev=pCur;//让prev指向当前结点
        CreateList(pCur.right);
    }
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null){
            return null;
        }
        CreateList(pRootOfTree);
        TreeNode head=pRootOfTree;
        while(head.left!=null){
            head=head.left;
        }
        return head;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值