検索
ホームページJava&#&チュートリアルJava のバイナリ ツリーの基本的な知識と概念は何ですか?

    1. ツリー構造

    1.1 概念

    ツリーは、n (n> ; n) で構成される非線形データ構造です。 =0) 有限ノードは階層関係を持つセットを形成します。逆さまの木、つまり根が上を向き、葉が下を向いているように見えるので、木と呼ばれます。

    Java のバイナリ ツリーの基本的な知識と概念は何ですか?

    1.2 概念 (重要)

    a. ノードの次数: ノードのサブツリーの数; 上に示すように: A の次数は 6, J の次数は 2

    b です。ツリーの次数: このツリーでは、上の図に示すように、最大​​のノードの次数が数値の次数になります。ツリーは 6

    c. リーフ ノード (ターミナル ノード): 次数 0 のノード (サブツリーのないノード)

    d. 親ノード/親ノード: 上に示すように: D は H

    の親ノードです。子ノード/子ノード: 上の図に示すように: H は D

    e の子ノードです。ルート ノード: 親のないノード。上の図に示されている: A

    f. ノード レベル: ルートから開始して、ルートはレベル 1、ルートの子ノードはレベル 2、などとなります;

    g.ツリーの高さまたは深さ: ツリー内のノードの最大レベル; 上に示すように: ツリーの高さは 4

    2. バイナリ ツリー (キー ポイント)

    2.1 概念

    各ノードには、次数

    2.2 バイナリ ツリーの基本形式

    Java のバイナリ ツリーの基本的な知識と概念は何ですか?

    ##2.3 2 つの特別なバイナリ木

    Java のバイナリ ツリーの基本的な知識と概念は何ですか?

    a. 完全な二分木: 非子葉次数は 2

    b. 完全な二分木: 完全な二分木には「右下」がありません。

    2.4 バイナリ ツリーのプロパティ

    a. 完全なバイナリ ツリー

    1. 高さは K なので、2^k-1 個あります。ノード

    2。レベルが K の場合、レイヤーには 2^(k-1) ノード

    3があります。エッジの数 = ノード数 - 1

    4。次数 0 の n0 と次数 2 の n2 があり、n0 = n2 1

    b. 完全な二分木

    1. 正しい子があれば、左の子が存在する必要があります

    2。次数 1 のノードは 1 つだけ存在できます

    2.5 バイナリ ツリーのストレージ

    バイナリ ツリーのストレージ構造は、次のように分割されます。 : 順次ストレージとリンクされたリストのようなストレージ。

    シーケンシャル ストレージ: 完全なバイナリ ツリーのみを保存できます

    チェーン ストレージ: 通常のバイナリ ツリー

    今回はチェーン ストレージを紹介します

    二分木はノードによって 1 つずつ参照されます。一般的な表現方法には二分表現と三分岐表現が含まれます。

    Java のバイナリ ツリーの基本的な知識と概念は何ですか?

    この図を例として取り上げます。詳細は次のとおりです。

    // 孩子表示法
    private static class TreeNode{
        char val;
        TreeNode left;
        TreeNode right;
     
        public TreeNode(char val) {
            this.val = val;
        }
    }

    初期化:

        public static TreeNode build(){
            TreeNode nodeA=new TreeNode('A');
            TreeNode nodeB=new TreeNode('B');
            TreeNode nodeC=new TreeNode('C');
            TreeNode nodeD=new TreeNode('D');
            TreeNode nodeE=new TreeNode('E');
            TreeNode nodeF=new TreeNode('F');
            TreeNode nodeG=new TreeNode('G');
            TreeNode nodeH=new TreeNode('H');
            nodeA.left=nodeB;
            nodeA.right=nodeC;
            nodeB.left=nodeD;
            nodeB.right=nodeE;
            nodeE.right=nodeH;
            nodeC.left=nodeF;
            nodeC.right=nodeG;
            return nodeA;
        }

    2.6 バイナリ ツリーの基本操作

    2.6.1 バイナリ ツリー トラバーサル (再帰)

    1. NLR: プリオーダー トラバーサル (別名: Preorder Traversal) Preorder Traversal) Order Traversal)—— ルート ノードにアクセスします ---> ルートの左側のサブツリー ---> ルートの右側のサブツリーにアクセスします。

        //先序遍历 : 根左右
        public static void preOrder(TreeNode root){
            if(root==null){
                return;
            }
            System.out.print(root.val+" ");
            preOrder(root.left);
            preOrder(root.right);
        }

    2. LNR: Inorder Traversal (Inorder Traversal)—— ルートの左側のサブツリー ---> ルート ノード ---> ルートの右側のサブツリー。

        //中序遍历
        public static void inOrder(TreeNode root){
            if(root==null){
                return;
            }
            preOrder(root.left);
            System.out.print(root.val+" ");
            preOrder(root.right);
        }

    3. LRN: ポストオーダー トラバーサル - ルートの左サブツリー ---> ルートの右サブツリー ---> ルート ノード。

        //后序遍历
        public static void postOrder(TreeNode root){
            if(root==null){
                return;
            }
            preOrder(root.left);
            preOrder(root.right);
            System.out.print(root.val+" ");
        }

    2.6.2 バイナリ ツリー トラバーサル (反復)

    1. プレオーダー トラバーサル

        //方法2(迭代)
        //先序遍历 (迭代)
        public static void preOrderNonRecursion(TreeNode root){
            if(root==null){
                return ;
            }
            Deque<TreeNode> stack=new LinkedList<>();
            stack.push(root);
            while (!stack.isEmpty()){
                TreeNode cur=stack.pop();
                System.out.print(cur.val+" ");
                if(cur.right!=null){
                    stack.push(cur.right);
                }
                if(cur.left!=null){
                    stack.push(cur.left);
                }
            }
        }

    2. インオーダー トラバーサル

        //方法2(迭代)
        //中序遍历 (迭代)
        public static void inorderTraversalNonRecursion(TreeNode root) {
            if(root==null){
                return ;
            }
     
            Deque<TreeNode> stack=new LinkedList<>();
            // 当前走到的节点
            TreeNode cur=root;
            while (!stack.isEmpty() || cur!=null){
                // 不管三七二十一,先一路向左走到根儿~
                while (cur!=null){
                    stack.push(cur);
                    cur=cur.left;
                }
                // 此时cur为空,说明走到了null,此时栈顶就存放了左树为空的节点
                cur=stack.pop();
                System.out.print(cur.val+" ");
                // 继续访问右子树
                cur=cur.right;
            }
        }

    3. ポストオーダー トラバーサル トラバース

        //方法2(迭代)
        //后序遍历 (迭代)
        public static void postOrderNonRecursion(TreeNode root){
            if(root==null){
                return;
            }
            Deque<TreeNode> stack=new LinkedList<>();
            TreeNode cur=root;
            TreeNode prev=null;
     
            while (!stack.isEmpty() || cur!=null){
                while (cur!=null){
                    stack.push(cur);
                    cur=cur.left;
                }
     
                cur=stack.pop();
                if(cur.right==null || prev==cur.right){
                    System.out.print(cur.val+" ");
                    prev=cur;
                    cur=null;
                }else {
                    stack.push(cur);
                    cur=cur.right;
                }
            }
        }

    2.6.3 バイナリ ツリーの基本操作

    1. ノード数を求める (再帰と反復)

        //方法1(递归)
        //传入一颗二叉树的根节点,就能统计出当前二叉树中一共有多少个节点,返回节点数
        //此时的访问就不再是输出节点值,而是计数器 + 1操作
        public static int getNodes(TreeNode root){
            if(root==null){
                return 0;
            }
            return 1+getNodes(root.left)+getNodes(root.right);
        }
     
        //方法2(迭代)
        //使用层序遍历来统计当前树中的节点个数
        public static int getNodesNoRecursion(TreeNode root){
            if(root==null){
                return 0;
            }
            int size=0;
            Deque<TreeNode> queue=new LinkedList<>();
            queue.offer(root);
            while (!queue.isEmpty()) {
                TreeNode cur = queue.poll();
                size++;
                if (cur.left != null) {
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
                    queue.offer(cur.right);
                }
            }
            return size;
        }

    2. 葉ノードの数を求める (再帰と反復) iteration)

        //方法1(递归)
        //传入一颗二叉树的根节点,就能统计出当前二叉树的叶子结点个数
        public static int getLeafNodes(TreeNode root){
            if(root==null){
                return 0;
            }
            if(root.left==null && root.right==null){
                return 1;
            }
            return getLeafNodes(root.left)+getLeafNodes(root.right);
        }
     
        //方法2(迭代)
        //使用层序遍历来统计叶子结点的个数
        public static int getLeafNodesNoRecursion(TreeNode root){
            if(root==null){
                return 0;
            }
            int size=0;
            Deque<TreeNode> queue=new LinkedList<>();
            queue.offer(root);
            while (!queue.isEmpty()){
                TreeNode cur=queue.poll();
                if(cur.left==null && cur.right==null){
                    size++;
                }
                if(cur.left!=null){
                    queue.offer(cur.left);
                }
                if(cur.right!=null){
                    queue.offer(cur.right);
                }
            }
            return size;
        }

    3. k 番目の層のノード数を求める

        //求出以root为根节点的二叉树第k层的节点个数
        public static int getKLevelNodes(TreeNode root,int k){
            if(root==null || k<=0){
                return 0;
            }
            if(k==1){
                return 1;
            }
            return getKLevelNodes(root.left,k-1)+getKLevelNodes(root.right,k-1);
        }

    4. 木の高さを求める

        //传入一个以root为根节点的二叉树,就能求出该树的高度
        public static int height(TreeNode root){
            if(root==null){
                return 0;
            }
            return 1+ Math.max(height(root.left),height(root.right));
        }

    5. 値があるかどうかを判定する値のノード

        //判断当前以root为根节点的二叉树中是否包含指定元素val,
        //若存在返回true,不存在返回false
        public static boolean contains(TreeNode root,char value){
            if(root==null){
                return false;
            }
            if(root.val==value){
                return true;
            }
            return contains(root.left,value) || contains(root.right,value);
        }

    2.7 二分木のレベル順走査

        //层序遍历
        public static void levelOrder(TreeNode root) {
            if(root==null){
                return ;
            }
     
            // 借助队列来实现遍历过程
            Deque<TreeNode> queue =new LinkedList<>();
            queue.offer(root);
            while (!queue.isEmpty()){
                int size=queue.size();
                for (int i = 0; i < size; i++) {
                    TreeNode cur=queue.poll();
                    System.out.print(cur.val+" ");
                    if(cur.left!=null){
                        queue.offer(cur.left);
                    }
                    if(cur.right!=null){
                        queue.offer(cur.right);
                    }
                }
            }
        }

    以上がJava のバイナリ ツリーの基本的な知識と概念は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明
    この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
    監視イベントを実装する方法は?原則から実践への包括的な分析監視イベントを実装する方法は?原則から実践への包括的な分析Apr 19, 2025 pm 02:12 PM

    プログラミングにおけるイベントをリスニングする実装の原則と方法に関して、イベントを聴くことは一般的な要件であり、特に特定の価値の変更を聞くことです。多くの人が...

    ProjectがJavaで開始されたときにEasypoiでの@excel AnnotationのSavePathパラメーターを動的に変更する方法は?ProjectがJavaで開始されたときにEasypoiでの@excel AnnotationのSavePathパラメーターを動的に変更する方法は?Apr 19, 2025 pm 02:09 PM

    開発プロセス中にJavaでエンティティクラスのアノテーションのパラメーターを動的に構成する方法は、さまざまな環境に応じて注釈パラメーターを動的に構成する必要性に遭遇することがよくあります...

    糸でpyflinkジョブを送信するときにエラーを報告するのはなぜですか?糸でpyflinkジョブを送信するときにエラーを報告するのはなぜですか?Apr 19, 2025 pm 02:06 PM

    PyflinkのジョブをYARNに送信するときにPythonスクリプトが見つからない理由の分析Yarnを介してPyflinkジョブを提出しようとすると、遭遇する可能性があります...

    Spring Boot Projectでサードパーティのインターフェイスが呼び出され、フィールド名のケースとGetterメソッドが一貫していない場合はどうすればよいですか?Spring Boot Projectでサードパーティのインターフェイスが呼び出され、フィールド名のケースとGetterメソッドが一貫していない場合はどうすればよいですか?Apr 19, 2025 pm 02:03 PM

    スプリングブートプロジェクトでデータを送信するためにサードパーティインターフェイスを呼び出す際に遭遇する困難は、春に使用されます...

    名前を数字に変換してグループ内でソートを実装する方法は?名前を数字に変換してグループ内でソートを実装する方法は?Apr 19, 2025 pm 01:57 PM

    名前を数字に変換してグループ内でソートを実装する方法は?ユーザーをグループでソートする場合、ユーザーの名前を数字に変換して、異なる可能性があることがよくあります...

    Javaリモートデバッグでは、リモートサーバーで一定の値を正しく取得するにはどうすればよいですか?Javaリモートデバッグでは、リモートサーバーで一定の値を正しく取得するにはどうすればよいですか?Apr 19, 2025 pm 01:54 PM

    Javaリモートデバッグでの絶え間ない買収に関する質問と回答は、Javaをリモートデバッグに使用する際に、困難な現象に遭遇する可能性があります。それ...

    バックエンド開発では、サービスレイヤーとDAOレイヤーの責任をどのように区別するか?バックエンド開発では、サービスレイヤーとDAOレイヤーの責任をどのように区別するか?Apr 19, 2025 pm 01:51 PM

    バックエンド開発における階層アーキテクチャの議論。バックエンド開発では、階層アーキテクチャは一般的にコントローラー、サービス、DAOの3層を含む一般的な設計パターンです...

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    SecLists

    SecLists

    SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

    WebStorm Mac版

    WebStorm Mac版

    便利なJavaScript開発ツール

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強力な PHP 統合開発環境

    Safe Exam Browser

    Safe Exam Browser

    Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。