国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java 完全二叉樹的構建與四種遍歷方法

2019-11-06 07:28:38
字體:
來源:轉載
供稿:網友

本來就是基礎知識,不能丟的太干凈,今天竟然花了那么長的時間才寫出來,記一下。

有如下的一顆完全二叉樹:

先序遍歷結果應該為:1  2  4  5  3  6  7

中序遍歷結果應該為:4  2  5  1  6  3  7

后序遍歷結果應該為:4  5  2  6  7  3  1 

層序遍歷結果應該為:1  2  3  4  5  6  7

二叉樹的先序遍歷、中序遍歷、后序遍歷其實都是一樣的,都是執行遞歸操作。

我這記錄一下層次遍歷吧:層次遍歷需要用到隊列,先入隊在出隊,每次出隊的元素檢查是其是否有左右孩子,有則將其加入隊列,由于利用隊列的先進先出原理,進行層次遍歷。

下面記錄下完整代碼(java實現),包括幾種遍歷方法:

import java.util.ArrayDeque;import java.util.ArrayList;import java.util.List;import java.util.Queue;/** * 定義二叉樹節點元素 * @author bubble * */class Node {       public Node leftchild;    public Node rightchild;    public int data;    public Node(int data) {        this.data = data;    }}public class TestBinTree {        /**     * 將一個arry數組構建成一個完全二叉樹     * @param arr 需要構建的數組     * @return 二叉樹的根節點     */    public Node initBinTree(int[] arr) {        if(arr.length == 1) {            return new Node(arr[0]);        }        List<Node> nodeList = new ArrayList<>();                for(int i = 0; i < arr.length; i++) {            nodeList.add(new Node(arr[i]));        }        int temp = 0;        while(temp <= (arr.length - 2) / 2) {  //注意這里,數組的下標是從零開始的            if(2 * temp + 1 < arr.length)                nodeList.get(temp).leftchild = nodeList.get(2 * temp + 1);            if(2 * temp + 2 < arr.length)                nodeList.get(temp).rightchild = nodeList.get(2 * temp + 2);            temp++;        }        return nodeList.get(0);       }     /**     * 層序遍歷二叉樹     * @param root 二叉樹根節點     * @param nodeQueue ,用到的隊列數據結構     */     public void trivalBinTree(Node root, Queue<Node> nodeQueue) {        nodeQueue.add(root);        Node temp = null;        while ((temp = nodeQueue.poll()) != null) {            System.out.PRint(temp.data + " ");            if (temp.leftchild != null) {                nodeQueue.add(temp.leftchild);            }            if (temp.rightchild != null) {                nodeQueue.add(temp.rightchild);            }        }    }          /**       * 先序遍歷       * @param root 二叉樹根節點       */        public void preTrival(Node root) {            if(root == null) {                return;            }            System.out.print(root.data + " ");            preTrival(root.leftchild);            preTrival(root.rightchild);        }        /**         * 中序遍歷         * @param root 二叉樹根節點         */        public void midTrival(Node root) {            if(root == null) {                return;            }            midTrival(root.leftchild);            System.out.print(root.data + " ");            midTrival(root.rightchild);        }        /**         * 后序遍歷         * @param root 二叉樹根節點         */        public void afterTrival(Node root) {            if(root == null) {                return;            }            afterTrival(root.leftchild);            afterTrival(root.rightchild);            System.out.print(root.data + " ");        }                        public static void main(String[] args) {            TestBinTree btree = new TestBinTree();            int[] arr = new int[] {1,2,3,4,5,6,7};            Node root = btree.initBinTree(arr);            Queue<Node> nodeQueue = new ArrayDeque<>();             System.out.println("層序遍歷:");            btree.trivalBinTree(root, nodeQueue);            System.out.println("/n先序遍歷:");            btree.preTrival(root);            System.out.println("/n中序遍歷:");            btree.midTrival(root);            System.out.println("/n后序遍歷:");            btree.afterTrival(root);                    }            } 結果:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 同心县| 简阳市| 德安县| 宁阳县| 三亚市| 武强县| 通许县| 金秀| 鹤壁市| 建平县| 祥云县| 梧州市| 个旧市| 汶上县| 贵港市| 大安市| 余江县| 龙井市| 桃园县| 博野县| 巴林右旗| 枞阳县| 随州市| 祁门县| 濮阳市| 台山市| 芦山县| 贞丰县| 永德县| 忻州市| 股票| 广东省| 突泉县| 永和县| 张家川| 安陆市| 鲜城| 林甸县| 通化市| 临朐县| 石首市|