二叉搜尋樹

2021-10-19 08:19:02 字數 1217 閱讀 9779

class

solution

}return g[n];}

}

動態規劃:遍歷陣列的每乙個數字 i,將其作為樹的根。則 i 左邊的序列構成其左子樹,右邊的序列構成右子樹。然後我們可以遞迴地構建左右子樹。

設g(n):長度為n的序列能構成的不同二叉搜尋樹的個數。

f(i,n):以 i 為根節點,長度為n的序列能構成的不同二叉搜尋樹的個數。則:g(n

)=∑i

=1nf

(i,n

)g(n) = \sum_^f(i,n)

g(n)=i

=1∑n

​f(i

,n)即以 i 為根節點的bst個數等於 i 左邊序列構成的bst個數乘以 i 右邊序列構成的bst個數。將 i 從1遍歷到n即為結果。

class

solution

return

gettree(1

,n);

}public list

gettree

(int start,

int end)

for(

int i = start;i <= end;i++)}

}return ans;

}}

用遞迴的思想解題,一定要明確遞迴函式的定義,並相信這個定義,不要過多地考慮遞迴實現的細節。這裡遞迴函式的作用是得到從1到n的序列組成的所有bst。那麼我繼續呼叫這個函式分別得到 i 的左邊序列和右邊序列構成的bst並進行拼接和儲存即可。最後不要忘記考慮base case!

class

solution

public

void

inorder

(treenode root)

inorder

(root.left);if

(pre != null && pre.val > root.val)

pre = root;

inorder

(root.right);}

}

關鍵在於找到兩個錯位的節點,最後再進行交換即可。bst的乙個重要性質是它的中序遍歷結果是有序(從小到大)的,我們可以利用這一性質找到錯位的節點。在出現下降趨勢的時候(也就是有錯誤點的時候),同時記錄 pre 和當前點。如果兩個錯誤點相鄰,那麼就完成了;如果不相鄰,在後面再出現錯誤點時就會覆蓋掉原來記錄的第二個點。

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...