博客
关于我
第1题:把二叉搜索树转换为一个排序的双向链表
阅读量:527 次
发布时间:2019-03-08

本文共 3747 字,大约阅读时间需要 12 分钟。

欢迎转载,转载请务必注明出处:

马上找工作了,准备好好学习下July大神整理的微软面试100题系列,代码使用Java实现(IntelliJ那个黑色主题真是程序员的大爱),顺便就复习一下Java和数据结构。闲话不多说,热腾腾的题和代码端上来。

第一题:把二叉搜索树转换为一个排序的双向链表

要求:不能创建新的节点,只能调整指针的指向
示例

从二叉搜索树的定义来看,root节点左子树上的值都是比它小的,右子树的值都是比它大的,所以变成双向链表后它的左邻居就应该是左子树中值最大的节点,右邻居就是右子树中值最小的节点。接下来就是递归求解实现了。

package Exam001;/** * Created by cq on 2015/3/18. * 二叉搜索树节点定义 */public class BSTreeNode {       private int value;    private BSTreeNode left;    private BSTreeNode right;    public BSTreeNode getLeft() {        return left;    }    public void setLeft(BSTreeNode left) {        this.left = left;    }    public int getValue() {        return value;    }    public void setValue(int value) {        this.value = value;    }    public BSTreeNode getRight() {        return right;    }    public void setRight(BSTreeNode right) {        this.right = right;    }    public BSTreeNode(int value){        this.value=value;    }}
package Exam001;/** * Created by cq on 2015/3/18. * 第一题:把二叉搜索树转换为一个排序的双向链表 * 要求:不能创建新的节点,只能调整指针的指向 */public class BSTree {    public BSTreeNode bstree;    //使用前序遍历打印二叉搜索树    public void printBSTree(BSTreeNode bst){        if (bst == null){            return;        }        printBSTree(bst.getLeft());        System.out.print(bst.getValue()+" ");        printBSTree(bst.getRight());    }    public BSTreeNode getDualLinkedList(BSTreeNode bst){        if (bst == null){            return null;        }        tree2List(bst);        return getMinNode(bst);    }    //二叉搜索树转为有序双向链表    public void tree2List(BSTreeNode bst){        if (bst == null){            return;        }        if (bst.getLeft() != null){            tree2List(bst.getLeft());            bst.setLeft(getMaxNode(bst.getLeft()));            bst.getLeft().setRight(bst);        }        if (bst.getRight() != null){            tree2List(bst.getRight());            bst.setRight(getMinNode(bst.getRight()));            bst.getRight().setLeft(bst);        }    }    //获取树中最大节点    public BSTreeNode getMaxNode(BSTreeNode bst){        if (bst == null){            return null;        }        while (bst.getRight() != null){            bst = bst.getRight();        }        return bst;    }    //获取树中最小节点    public BSTreeNode getMinNode(BSTreeNode bst){        if (bst == null){            return null;        }        while (bst.getLeft() != null){            bst = bst.getLeft();        }        return bst;    }    //打印双向链表    public void printDualLinkedList(BSTreeNode dList){        if (dList == null){            return;        }        System.out.print("正向打印双向链表:");        while(dList.getRight() != null){            System.out.print(dList.getValue()+" ");            dList = dList.getRight();        }        System.out.print(dList.getValue()+" ");        System.out.print("\n反向打印双向链表:");        while (dList.getLeft() != null){            System.out.print(dList.getValue()+" ");            dList = dList.getLeft();        }        System.out.print(dList.getValue()+" ");    }    public static void main(String[] args){        BSTree bst = new BSTree();        bst.bstree = new BSTreeNode(10);        BSTreeNode node2 = new BSTreeNode(6);        BSTreeNode node3 = new BSTreeNode(14);        BSTreeNode node4 = new BSTreeNode(4);        BSTreeNode node5 = new BSTreeNode(8);        BSTreeNode node6 = new BSTreeNode(12);        BSTreeNode node7 = new BSTreeNode(16);        bst.bstree.setLeft(node2);        bst.bstree.setRight(node3);        node2.setLeft(node4);        node2.setRight(node5);        node3.setLeft(node6);        node3.setRight(node7);        System.out.print("前序遍历二叉搜索树:");        bst.printBSTree(bst.bstree);        System.out.println();        BSTreeNode tmp = bst.getDualLinkedList(bst.bstree);        bst.printDualLinkedList(tmp);    }}

先这样,后面再看看有没有什么可以改进的地方。

你可能感兴趣的文章
Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(上)
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(下)
查看>>
Nacos心跳机制实现快速上下线
查看>>
nacos报错com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
查看>>
nacos服务提供和发现及客户端负载均衡配置
查看>>
Nacos服务注册与发现demo
查看>>
Nacos服务注册与发现的2种实现方法!
查看>>
nacos服务注册和发现原理简单实现案例
查看>>
Nacos服务注册总流程(源码分析)
查看>>
nacos服务注册流程
查看>>
Nacos服务部署安装
查看>>
nacos本地可以,上服务器报错
查看>>
Nacos注册Dubbo(2.7.x)以及namespace配置
查看>>
Nacos注册中心有几种调用方式?
查看>>
nacos注册失败,Feign调用失败,feign无法注入成我们的bean对象
查看>>
nacos源码 nacos注册中心1.4.x 源码 nacos源码如何下载 nacos 客户端源码下载地址 nacos discovery下载地址(一)
查看>>
nacos源码 nacos注册中心1.4.x 源码 spring cloud alibaba 的discovery做了什么 nacos客户端是如何启动的(二)
查看>>
nacos源码 nacos注册中心1.4.x 源码 如何注册服务 发送请求,nacos clinet客户端心跳 nacos 注册中心客户端如何发送的心跳 (三)
查看>>
Nacos源码分析:心跳机制、健康检查、服务发现、AP集群
查看>>