二叉搜索树与双向链表

题目描述

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

思路1:

用递归将中序遍历数列存到一个队列中,之后循环出队列实现双向链表。

//中序遍历就是已经排序号的数列
public TreeNode Convert(TreeNode pRootOfTree) {
    if(pRootOfTree == null) return null;
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    TargetList(pRootOfTree,queue);
    TreeNode firstNode = queue.poll();
    TreeNode preTmp=firstNode,tmp;
    while((tmp=queue.poll())!=null){
        tmp.left = null;
        tmp.right = null;
        preTmp.right = tmp;
        tmp.left = preTmp;
        preTmp = tmp;
    }
       return firstNode;
   }

private void TargetList(TreeNode pRootOfTree, Queue<TreeNode> queue) {
    if (pRootOfTree.left != null) {
        TargetList(pRootOfTree.left,queue);
    }
    queue.offer(pRootOfTree);
    if (pRootOfTree.right != null) {
        TargetList(pRootOfTree.right,queue);
    }
}

思路2:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。

public TreeNode Convert(TreeNode root) {
    if(root==null)
        return null;
    if(root.left==null&&root.right==null)
        return root;
    // 1.将左子树构造成双链表,并返回链表头节点
    TreeNode left = Convert(root.left);
    TreeNode p = left;
    // 2.定位至左子树双链表最后一个节点
    while(p!=null&&p.right!=null){
        p = p.right;
    }
    // 3.如果左子树链表不为空的话,将当前root追加到左子树链表
    if(left!=null){
        p.right = root;
        root.left = p;
    }
    // 4.将右子树构造成双链表,并返回链表头节点
    TreeNode right = Convert(root.right);
    // 5.如果右子树链表不为空的话,将该链表追加到root节点之后
    if(right!=null){
        right.left = root;
        root.right = right;
    }
    return left!=null?left:root;       
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值