博客
关于我
第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);    }}

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

你可能感兴趣的文章
Navicat怎样筛选数据
查看>>
Navicat报错connection is being used
查看>>
Navicat报错:1045-Access denied for user root@localhost(using passwordYES)
查看>>
Navicat控制mysql用户权限
查看>>
navicat操作mysql中某一张表后, 读表时一直显示正在载入,卡死不动,无法操作
查看>>
Navicat连接mysql 2003 - Can't connect to MySQL server on ' '(10038)
查看>>
Navicat连接mysql数据库中出现的所有问题解决方案(全)
查看>>
Navicat连接Oracle出现Oracle library is not loaded的解决方法
查看>>
Navicat连接Oracle数据库以及Oracle library is not loaded的解决方法
查看>>
Navicat连接sqlserver提示:未发现数据源名并且未指定默认驱动程序
查看>>
navicat连接远程mysql数据库
查看>>
Navicat通过存储过程批量插入mysql数据
查看>>
Navicat(数据库可视化操作软件)安装、配置、测试
查看>>
navigationController
查看>>
NB-IOT使用LWM2M移动onenet基础通信套件对接之APN设置
查看>>
NBear简介与使用图解
查看>>
Vue过滤器_使用过滤器进行数据格式化操作---vue工作笔记0015
查看>>
Ncast盈可视 高清智能录播系统 IPSetup.php信息泄露+RCE漏洞复现(CVE-2024-0305)
查看>>
NCNN中的模型量化解决方案:源码阅读和原理解析
查看>>
NCNN源码学习(1):Mat详解
查看>>