剑指offer之二叉搜索树与双向链表

将二叉搜索树转为排序的双向链表

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

/*
 * 递归方法:
 * 由于题目要求排序的双向列表,所以首先将二叉搜索树中序遍历,这里采用一个队列来存放要排序的节点,每访问一个节点将其
 * 入队,最后全部入队后队列里面是排好序的节点,队首是值最小的节点。然后开始出队,每出队一个元素,将该元素的right指向
 * 队首元素,将队首元素的left指向刚才出队的那个元素。直到队列中只有1个元素时,这时双向列表已经已经链接好了,但是题目里面唯一
 * 提供的一个引用还在链表尾部,所以再将该引用通过循环指向双向链表头部那个最小的节点并返回,OK,我的这种方法应该是比较好理解的。
 */
import java.util.LinkedList;
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        //创建一个空队列
        LinkedList<TreeNode> queue=new LinkedList<TreeNode>();

        if(pRootOfTree==null) return null;
        else inRootTraverse(pRootOfTree, queue);

        while(queue.size()>1){
            pRootOfTree=queue.poll();//队首节点出队
            pRootOfTree.right=queue.peek();
            queue.peek().left=pRootOfTree;
        }
        //由于题目不让创建新的节点,而现在题目提供的引用指向列表尾部,所以只能将提供的引用指向链表首部
        while(pRootOfTree.left!=null) pRootOfTree=pRootOfTree.left;

        return pRootOfTree;
    }
    //中序遍历二叉搜索树
    public void inRootTraverse(TreeNode root,LinkedList<TreeNode> queue){
        if(root!=null){
            inRootTraverse(root.left, queue);
            queue.add(root);//入队
            inRootTraverse(root.right, queue);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值