面试题36:二叉搜索树与双向链表

/*

 * 面试题36:二叉搜索树与双向链表

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

 * 思路:1、将左子树构成双链表,并返回该链表的头节点(左子树最左边的节点)

 * 2、定位到左链表的最后一个节点(左子树最右边的节点)

 * 3、如果左子树链表不为空,则将当前root追加到左子树链表后

 * 4、将右子树构造成双向链表,并返回链表头结点(右子树最左边的节点)

 * 5、如果右子树链表不为空,将右子树链表追加到当前root

 * 6,根据左子树链表是否为空返回的整体双向链表的头节点

 */

class TreeNode7 {

    int val = 0;

    TreeNode7 left = null;

    TreeNode7 right = null;

 

    public TreeNode7(int val) {

       this.val = val;

    }

}

 

public class No36Convert {

 

    public static void main(String[] args) {

        TreeNode7 root = new TreeNode7(10);

        TreeNode7 node6 = new TreeNode7(6);

        TreeNode7 node14 = new TreeNode7(14);

        TreeNode7 node4 = new TreeNode7(4);

        TreeNode7 node8 = new TreeNode7(8);

        TreeNode7 node12 = new TreeNode7(12);

        TreeNode7 node16 = new TreeNode7(16);

 

        root.left = node6;

        root.right = node14;

 

        node6.left = node4;

        node6.right = node8;

 

        node14.left = node12;

        node14.right = node16;

 

        TreeNode7 head = Convert(root);

        if(head == null){

            System.out.println("head == null");

        }

        TreeNode7 node = head;

        while(node != null){

 

            System.out.println(node.val);

            node = node.right;

        }

 

    }

    //Convert函数把一个二叉搜索树变成一个有序的双向链表,返回双向链表的头结点,参数root为二叉搜索树

    public static TreeNode7 Convert(TreeNode7 pRootOfTree) {

       if(pRootOfTree==null){//假如根节点为空,返回空

            return null;

        }

        if(pRootOfTree.left==null&&pRootOfTree.right==null){//假如只有一个根节点,则返回根节点

            return pRootOfTree;

        }

        //1、将左子树构造成双链表,并返回该链表头结点left

        TreeNode7 left=Convert(pRootOfTree.left);

 

        //2、定位到左子树链表的最后一个节点(左子树最右边的节点)

        TreeNode7 p=left;//创建一个临时节点P,用来遍历找到左链表的最后一个节点(左子树最右边的节点)p初始化指向做左子树的根节点,

        while(p!=null&&p.right!=null){

            p=p.right;//最终p为左子树最右边的节点

        }

        //3、如果左子树链表不为空,将当前root追加到左子树链表后

        if(left!=null){//左子树链表不为空

            p.right=pRootOfTree;//左子树链表的最后一个节点p(左子树最右边节点)的右指针指向当前root节点

            pRootOfTree.left=p;//当前root节点的左指针指向左子树链表的最后一个节点p(左子树最右边节点)

        }

        //4、将右子树构造成双链表,并返回该链表的头结点right

        TreeNode7 right=Convert(pRootOfTree.right);

 

        //5、如果右子树链表不为空,将右子树链表追加到当前root

        if(right!=null){//右子树链表不为空

            right.left=pRootOfTree;//右子树链表的头结点right的左指针指向当前root

            pRootOfTree.right=right;//当前root的右指针指向右子树链表的头结点right

        }

        return left!=null?left:pRootOfTree;//根据左子树链表是否为空返回整个双向链表的头指针。

    }

 

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值