二叉樹操作(Java語言)__Java

來源:互聯網
上載者:User
基本概念 樹

除了根節點之外,每個節點只要一個父節點,根節點沒有父節點。除了分葉節點之外,所有節點都有一個或者多個節點,分葉節點沒有子節點。父節點和子節點之間用指標相連。 二叉樹

所謂二叉樹是樹的一種特殊結構,在二叉樹中每個節點最多隻能擁有兩個子節點。



二叉樹具有以下性質: 非空二叉樹的第n層上至多有2^(n-1)個元素。 深度為h的二叉樹至多有2^h-1個結點。 資料結構定義

public class BTNode {    int val; //值    BTNode left;    //左子樹    BTNode right;   //右子樹    public BTNode(){    }    public BTNode(int val){        this.val = val;    }    public BTNode(int val, BTNode left, BTNode right) {        this.val = val;        this.left = left;        this.right = right;    }}
二叉樹操作 遍曆

遍曆即將樹的所有結點訪問且僅訪問一次。按照根節點位置的不同分為前序走訪,中序遍曆,後序遍曆。 前序走訪:先訪問根結點,再訪問左子結點,最後訪問右子結點 中序遍曆:先訪問左子結點,再訪問根結點,最後訪問右子結點 後序遍曆:先訪問左子結點,再訪問右子結點,最後訪問根結點

如下圖所示二叉樹



前序走訪:10 6 4 2 8 14 12 16
中序遍曆:2 4 6 8 10 12 14 16
後序遍曆:2 4 8 6 12 16 14 10 代碼實現 前序走訪

/**     * 前序走訪     * 先訪問根結點,再訪問左子結點,最後訪問右子結點     * @param root     */    public void preorder(BTNode root){        //先訪問根結點        System.out.print(root.val+" ");        if(root.left!=null){            preorder(root.left);        }        if(root.right!=null){            preorder(root.right);        }    }
中序遍曆
/**     * 中序遍曆     * 先訪問左子結點,再訪問根結點,最後訪問右子結點     * @param root     */    public void middleorder(BTNode root){        //先訪問左子結點        if(root.left!=null){            middleorder(root.left);        }        System.out.print(root.val+" ");        if(root.right!=null){            middleorder(root.right);        }    }
後序遍曆
/**     * 後序遍曆     * 先訪問左子結點,再訪問右子結點,最後訪問根結點     * @param root     */    public void lastorder(BTNode root){        if(root.left!=null){            lastorder(root.left);        }        if(root.right!=null){            lastorder(root.right);        }        System.out.print(root.val+" ");    }
層次遍曆
/**     * 層次遍曆     * @param root     */    public void layerorder(BTNode root){        if(root==null){            return;        }        //隊列,先進先出        Queue<BTNode> queue = new LinkedList<>();        queue.add(root);        while(!queue.isEmpty()){            BTNode node = queue.poll();            System.out.print(node.val+" ");            if(node.left!=null){                queue.add(node.left);            }            if(node.right!=null){                queue.add(node.right);            }        }    }
擷取二叉樹的高度
/**     * 擷取二叉樹的高度     * @param root     * @return     */    public int getHeight(BTNode root){        if(root==null){            return 0;        }        int left = getHeight(root.left);          int right = getHeight(root.right);        int h = (left>right?left:right)+1;        return h;      }
擷取二叉樹結點的數量
/**     * 擷取二叉樹結點的數量     * @param root     * @return     */    public int getCount(BTNode root){        if(root==null){            return 0;        }        return getCount(root.left)+getCount(root.right)+1;    }
判斷兩棵 二叉樹 是否相等
/**     * 判斷兩棵 二叉樹 是否相等     * @param root1     * @param root2     * @return     */    public boolean equals(BTNode root1, BTNode root2){        if((root1==null && root2==null) ||root1.val == root2.val){            return true;        }        if(equals(root1.left, root2.left) && equals(root1.right, root2.right)){            return true;        }        return false;    }
測試代碼
        //構造上圖中的二叉樹        BTNode node8 = new BTNode(2);        BTNode node4 = new BTNode(4, node8, null);        BTNode node5 = new BTNode(8);        BTNode node2 = new BTNode(6, node4, node5);        BTNode node6 = new BTNode(12);        BTNode node7 = new BTNode(16);        BTNode node3 = new BTNode(14, node6, node7);        BTNode root = new BTNode(10, node2, node3);        System.out.println("前序走訪:");        preorder(root);        System.out.println("--------------");        System.out.println("中序遍曆:");        middleorder(root);        System.out.println("--------------");        System.out.println("後序遍曆:");        lastorder(root);        System.out.println("--------------");        System.out.println("層次遍曆:");        layerorder(root);        System.out.println("--------------");        System.out.println("結點數量:"+getCount(root));        System.out.println("--------------");        System.out.println("高度:"+getHeight(root));

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.