タイトル説明
入力バイナリ検索ツリーを、バイナリ検索ツリーはに変換され、ソートされた二重リンクリスト。要件は、任意の新しいノードを作成することはできません、ツリー内のノードへのポイントは、ポインタのみを調整することができます。例えば、図バイナリサーチツリーの左側を入力し、ソートされた二重リンクリストは、変換後に出力されます。
アイデア解析
、我々はルートノードに横断したときに、その左部分木は、リストの並べ替えに変換され、リスト内の最後のノードでノードの最大値であり、された、思考の順序トラバーサルにノードを使用し、この時点で接続されたルートノードは、右の子の中で最小のツリーと右の部分木は、ルートノードと接続ノードを横断するルートのリスト内の最後のノードです。
テストケース
- 機能試験:バイナリ入力は、完全二分木であり、すべてのノードが左/右サブツリーバイナリない;バイナリツリーの唯一のノード。
- 特別な入力テスト:nullptrポインタを指し二分木のルート・ノード・ポインタ。
Javaコード
public class Offer36 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static TreeNode Convert(TreeNode pRootOfTree) {
return Solution1(pRootOfTree);
}
private static TreeNode Solution1(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return pRootOfTree;
}
TreeNode lastNodeInList = null;
lastNodeInList = covertCore(pRootOfTree, lastNodeInList);
TreeNode firstNodeInList = lastNodeInList;
while (firstNodeInList != null && firstNodeInList.left != null) {
firstNodeInList = firstNodeInList.left;
}
return firstNodeInList;
}
private static TreeNode covertCore(TreeNode pRootOfTree, TreeNode lastNodeInList) {
if (pRootOfTree.left != null) {
lastNodeInList = covertCore(pRootOfTree.left, lastNodeInList);
}
pRootOfTree.left = lastNodeInList;
if (lastNodeInList != null) {
lastNodeInList.right = pRootOfTree;
}
lastNodeInList = pRootOfTree;
if (pRootOfTree.right != null) {
lastNodeInList = covertCore(pRootOfTree.right, lastNodeInList);
}
return lastNodeInList;
}
private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}