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

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

你可能感兴趣的文章
MYSQL遇到Deadlock found when trying to get lock,解决方案
查看>>
mysql部署错误
查看>>
MySQL配置信息解读(my.cnf)
查看>>
Mysql配置文件my.ini详解
查看>>
MySQL配置文件深度解析:10个关键参数及优化技巧---强烈要求的福利来咯。
查看>>
Mysql配置表名忽略大小写(SpringBoot连接表时提示不存在,实际是存在的)
查看>>
mysql配置读写分离并在若依框架使用读写分离
查看>>
MySQL里为什么会建议不要使用SELECT *?
查看>>
MySQL里的那些日志们
查看>>
MySQL锁
查看>>
MySQL锁与脏读、不可重复读、幻读详解
查看>>
MySQL锁机制
查看>>
mysql锁机制,主从复制
查看>>
Mysql锁机制,行锁表锁
查看>>
MySQL锁表问题排查
查看>>
Mysql锁(2):表级锁
查看>>
MySQL锁,锁的到底是什么?
查看>>
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
查看>>
Mysql错误2003 -Can't connect toMySQL server on 'localhost'(10061)解决办法
查看>>
MySQL错误提示mysql Statement violates GTID consistency
查看>>