二叉搜索树转换双向链表——剑指offer(Java)

/*题目
 * 二叉搜索树转换为双向链表
 * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
 * 要求不能创建任新的结点,只能调整树中结点指针的指向。
 * 比如输入下图中左边儿二搜索树,则输出转换后的排序双向链表。
 *   4
    /  \
   2    5
  / \   / \
 1   3 5  7
 4=6=8=10=12=14=16
 * */

/*思路
 *  中序遍历就是有序的顺序,然后在遍历的过程中建立链表
 *  利用一个lastlist 记录上次结点,然后递归中序遍历,结点左边等于上次结点,
 *  上次的结点等于当前结点cur,依次类推,直到树的最后的右结点,最后调整链表把头结点返回
 *
 * */

 class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }
    }

    public TreeNode Convert(TreeNode pRootOfTree){
        TreeNode lastlist = ConvertNode(pRootOfTree, null);

        TreeNode pHead = lastlist;
        while(pHead != null && pHead.left != null ){ //最后遍历完lastlist代表尾结点,所以需要反转返回头结点
            pHead = pHead.left;
        }

        return pHead;
    }

    public TreeNode ConvertNode(TreeNode root,TreeNode lastlist){

        if (root == null)
            return null;

        TreeNode cur = root;

        if (cur.left != null){
            lastlist = ConvertNode(cur.left, lastlist);
        }

        cur.left = lastlist; //当前结点 左指针 指向上次结点

        if (lastlist != null){
            lastlist.right = cur; //上次结点的 右指针指向 现结点
        }

        lastlist = cur;  // 上次结点继续右移到 现结点

        if (cur.right != null) {
            lastlist = ConvertNode(cur.right, lastlist);
        }

        return lastlist;
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值