Leetcode109——Convert Sorted List to Binary Search Tree

文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡書

1. 問題描述

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

2. 求解

這個(gè)題主要是根據(jù)一個(gè)有序鏈表構(gòu)造二叉查找樹(樹的左結(jié)點(diǎn)小于根節(jié)點(diǎn),根節(jié)點(diǎn)小于右結(jié)點(diǎn),子樹具有同樣的性質(zhì))。與有序數(shù)組最大的不同在于有序鏈表只能從前往后遍歷,不能像有序數(shù)組一樣訪問任意位置的元素。因此構(gòu)造時(shí)需要按順序構(gòu)造,其實(shí)有序鏈表是二叉查找樹的中序遍歷。因此需要按照中序遍歷的順序進(jìn)行構(gòu)建,先構(gòu)建左子樹,再構(gòu)造根節(jié)點(diǎn),最后構(gòu)造右子樹。由于是鏈表,每次構(gòu)造之后頭結(jié)點(diǎn)應(yīng)該進(jìn)行移動(dòng),Java中用了一個(gè)靜態(tài)變量來保存根節(jié)點(diǎn)的位置。構(gòu)造方法主要是遞歸,每次構(gòu)建子樹時(shí)都需要將數(shù)組分成左右兩半,左邊的構(gòu)建左子樹,右邊的構(gòu)建右子樹,中間元素構(gòu)造根節(jié)點(diǎn)。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    static ListNode h;
    
    public TreeNode sortedListToBST(ListNode head) {
        if(head == null) {
            return null;
        }
        int length = 0;
        h = head;
        //得到鏈表長度
        while(head != null) {
            length++;
            head = head.next;
        }
        return buildBinarySearchTree(h, 0, length - 1);
    }
    
    public TreeNode buildBinarySearchTree(ListNode head, int start, int end) {
        if(start > end) {
            return null;
        }
        int mid = (start + end) / 2;
        //先構(gòu)建左子樹
        TreeNode left = buildBinarySearchTree(h, start, mid - 1);
        //再構(gòu)造根節(jié)點(diǎn)
        TreeNode root = new TreeNode(h.val);
        h = h.next;
        //最后構(gòu)造右子樹
        TreeNode right = buildBinarySearchTree(h, mid + 1, end);
        root.left = left;
        root.right = right;
        return root;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 6,004評(píng)論 0 19
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,685評(píng)論 0 25
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學(xué)在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,377評(píng)論 0 12
  • 1.樹(Tree): 樹是 n(n>=0) 個(gè)結(jié)點(diǎn)的有限集。當(dāng) n=0 時(shí)稱為空樹。在任意一顆非空樹中:有且僅有一...
    ql2012jz閱讀 1,193評(píng)論 0 3
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表,棧,隊(duì)列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,764評(píng)論 1 31

友情鏈接更多精彩內(nèi)容