[オファー] [36] [二分探索木と二重リンクリスト]

タイトル説明

  入力バイナリ検索ツリーを、バイナリ検索ツリーはに変換され、ソートされた二重リンクリスト要件は、任意の新しいノードを作成することはできません、ツリー内のノードへのポイントは、ポインタのみを調整することができます。例えば、図バイナリサーチツリーの左側を入力し、ソートされた二重リンクリストは、変換後に出力されます。
  


 

牛が質問がネットワークに対処はねのけます

アイデア解析

  、我々はルートノードに横断したときに、その左部分木は、リストの並べ替えに変換され、リスト内の最後のノードでノードの最大値であり、された、思考の順序トラバーサルにノードを使用し、この時点で接続されたルートノードは、右の子の中で最小のツリーと右の部分木は、ルートノードと接続ノードを横断するルートのリスト内の最後のノードです。

テストケース

  1. 機能試験:バイナリ入力は、完全二分木であり、すべてのノードが左/右サブツリーバイナリない;バイナリツリーの唯一のノード。
  2. 特別な入力テスト: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() {

    }
}

コードリンク

安全コードを証明するためにオファー-Java

おすすめ

転載: www.cnblogs.com/haoworld/p/offer36-er-cha-sou-suo-shu-yu-shuang-xiang-lian-bi.html