博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode — convert-sorted-list-to-binary-search-tree
阅读量:5744 次
发布时间:2019-06-18

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

import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * Source : https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ * * * Given a singly linked list where elements are sorted in ascending order, * convert it to a height balanced BST. */public class ConvertSortedList {    /**     * 将一个有序链表转化为一棵AVL树     * 可以先把单向链表转化为有序数组,然后将数组转化为AVL树     * 或者使用双指针,快指针每次移动两个位置,慢指针每次移动一个位置,这样就能找到中间的节点     *     * 还有一种方法:     * 找到链表总个数total,一次递归如下:     * 递归查找左子树,每次递归的时候将head指向下一个节点     * 左子树递归完成之后,head指向了mid节点     * 构造root节点,当前head指向的就是mid节点,也就是root节点     * 递归构造右子树     * 构造根节点,并返回     *     * @param head     * @return     */    public TreeNode convert (ListNode head) {        ListNode node = head;        int total = 0;        while (node != null) {            total++;            node = node.next;        }        return convert(new HeadHolder(head), 0, total-1);    }    /**     * 因为每次递归需要改变head的值,所以使用一个HeadHolder指向head,每次修改headHolder的指向     *     * @param head     * @param left     * @param right     * @return     */    public TreeNode convert (HeadHolder head, int left, int right) {        if (left > right) {            return null;        }        int mid = (left + right) / 2;        TreeNode leftChild = convert(head, left, mid-1);        // 上面递归完成之后,head指向了mid位置的节点        TreeNode root = new TreeNode(head.head.value);        // head的下一个节点就是右子树的第一个节点        head.head = head.head.next;        TreeNode rightChild = convert(head, mid+1, right);        root.leftChild = leftChild;        root.rightChild = rightChild;        return root;    }    private class HeadHolder {        ListNode head;        public HeadHolder(ListNode head) {            this.head = head;        }    }    public ListNode createList (int[] arr) {        if (arr.length == 0) {            return null;        }        ListNode head = new ListNode();        head.value = arr[0];        ListNode pointer = head;        for (int i = 1; i < arr.length; i++) {            ListNode node = new ListNode();            node.value = arr[i];            pointer.next = node;            pointer = pointer.next;        }        return head;    }    public void binarySearchTreeToArray (TreeNode root, List
chs) { if (root == null) { chs.add('#'); return; } List
list = new ArrayList
(); int head = 0; int tail = 0; list.add(root); chs.add((char) (root.value + '0')); tail ++; TreeNode temp = null; while (head < tail) { temp = list.get(head); if (temp.leftChild != null) { list.add(temp.leftChild); chs.add((char) (temp.leftChild.value + '0')); tail ++; } else { chs.add('#'); } if (temp.rightChild != null) { list.add(temp.rightChild); chs.add((char)(temp.rightChild.value + '0')); tail ++; } else { chs.add('#'); } head ++; } //去除最后不必要的 for (int i = chs.size()-1; i > 0; i--) { if (chs.get(i) != '#') { break; } chs.remove(i); } } private class TreeNode { TreeNode leftChild; TreeNode rightChild; int value; public TreeNode(int value) { this.value = value; } public TreeNode() { } } private class ListNode { ListNode next; int value; public ListNode(int value) { this.value = value; } public ListNode() { } } public static void main(String[] args) { ConvertSortedList convertSortedList = new ConvertSortedList(); int[] arr = new int[]{1,2,3,4,5,6}; List
chs = new ArrayList
(); TreeNode root = convertSortedList.convert(convertSortedList.createList(arr)); convertSortedList.binarySearchTreeToArray(root, chs); System.out.println(Arrays.toString(chs.toArray(new Character[chs.size()]))); }}

转载于:https://www.cnblogs.com/sunshine-2015/p/7811663.html

你可能感兴趣的文章
Linux上的Web服务调试工具-MitmProxy
查看>>
raid-1 镜像卷的创建
查看>>
A Vision for Making Deep Learning Simple
查看>>
正常流,dom树,css脱离文档流就不占据空间了吗?脱离文档流是不是指该元素从dom树中脱离?...
查看>>
ORACLE中date类型字段的处理
查看>>
dotlx实验
查看>>
SQL -- ifnull(sum(属性) vs 对象.属性)
查看>>
java.lang.Random误区
查看>>
初学者
查看>>
Secure Delivery Center快速入门指南(一):概述
查看>>
Kendo UI常用示例汇总(十三)
查看>>
Zend Studio使用教程:将应用程序部署到Zend Server(2/2)
查看>>
FR 参数为空时显示所有结果
查看>>
js中bind、call、apply函数的用法
查看>>
OC高效率52之多用GCD,少用performSelector系列方法
查看>>
sqoop导入关系型数据库-解密Sqoop
查看>>
语音分享应用ios源码项目
查看>>
性能测试结果分析
查看>>
Linux-dns基础知识和BIND的简单配置-1
查看>>
kafka Corrupt index found
查看>>