題目雖然短短的兩行字,但真心不簡單(哭)。這道題的關鍵是二叉搜尋樹樹的中序遍歷。
首先什麼是二叉搜尋樹呢?就是根的左子樹的值全部小於根節點的值,根的右子樹的值全部大於根節點的值(遞迴下去,其左子樹與右子樹也滿足該性質)巧的是二叉搜尋樹的中序遍歷是遞增的,剛好滿足題目的排序要求(這就很棒)。
解題三部曲 先排序,再雙向鍊錶,最後迴圈。
排序: 節點應從小到大排序,用中序遍歷即可解決
雙向鍊錶:(將left當做前驅,right當做後繼) 在構建相鄰節點(設前驅節點 prev,當前節點 cur (兩個千萬別衝突prev和cur是我們建立的用來方便連線的)關係時,不僅應pre.right = cur,也應cur.left = pre。
結合下面來理解
最開始
更新第乙個前驅
更新第乙個後繼
3. 迴圈鍊錶: 設煉表頭節點head和尾節點tail,則應構建head.left = tail和tail.right = head。
class
solution
prev=cur;
inorder
(cur.right);}
public node treetodoublylist
(node root)
//找尾
while
(tail.right!=null)
//連線頭和尾
head.left=tail;
tail.right=head;
return head;
}}
劍指offer 66道 跳台階
時間限制 1秒 空間限制 32768k 熱度指數 373877 題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 與斐波那契數列思想一樣,同樣使用迴圈代替遞迴,時間複雜度為o n coding utf 8 class sol...
劍指offer 二叉樹 二叉樹搜尋樹
package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...
劍指offer 二叉搜尋樹和雙向鍊錶
題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解答 利用二叉樹的中序遍歷,找到第乙個訪問的結點 利用標誌位first 用head記...