資料結構--樹

來源:互聯網
上載者:User

標籤:main   void   科學   tle   post   add   bin   訪問   code   

無論是鏈表,棧還是隊列,它們都是線性結構的,每個節點的左邊最多一個節點,右邊也最多一個節點,對於大量的輸入資料,線性表的訪問時間太慢,不宜使用。這裡我要說一種非線性資料結構,其大部分操作的已耗用時間平均為O(logn)。

我們涉及到的這種資料結構叫做樹。在電腦科學中,樹是非常有用的抽象概念。我們形象的去描述一棵樹,一個家族的老祖可能有兩個兒子,這兩個兒子一個有一個兒子,一個有三個兒子,像這樣發展下去的一個族譜,就是一個樹。下面是常見的一種樹:二叉樹。

 

本文中以二叉樹為例,將二叉樹的資料結構定義,深度計算,幾種遍曆方式進行JAVA編碼實現。

1.二叉樹的資料結構

public class BinaryTreeNode {    private int data;    private BinaryTreeNode leftNode;    private BinaryTreeNode rightNode;}

 

2.深度計算,二叉樹的深度計算通過其本身的結構特性可進行遞迴。

public static int getDepth(BinaryTreeNode treeNode) {if (treeNode == null) {return 0;}int data=treeNode.getData();System.out.println(data);int left = getDepth(treeNode.getLeftNode());int right = getDepth(treeNode.getRightNode());int depth = Math.max(left, right) + 1;return depth;}

3.二叉樹的遍曆:前,中,後續。廣度優先。

/**     * 廣度優先遍曆     * @param treeNode     */    public static void visitBreadth(BinaryTreeNode treeNode)    {        Deque<BinaryTreeNode> queueList =new ArrayDeque<BinaryTreeNode>();        queueList.add(treeNode);        while (queueList.size()!=0) {            BinaryTreeNode currNode=queueList.peekFirst();            System.out.println(currNode.getData());            if (currNode.getLeftNode()!=null) {                queueList.add(currNode.getLeftNode());            }            if (currNode.getRightNode()!=null) {                queueList.add(currNode.getRightNode());            }            queueList.removeFirst();        }    }        //前序走訪      public void preOrder(BinaryTreeNode subTree){          if(subTree!=null){              System.out.println(subTree.getData());            postOrder(subTree.getLeftNode());              postOrder(subTree.getRightNode());         }      }            //中序遍曆      public void inOrder(BinaryTreeNode subTree){          if(subTree!=null){               postOrder(subTree.getLeftNode());               System.out.println(subTree.getData());             postOrder(subTree.getRightNode());          }      }            //後續遍曆      public void postOrder(BinaryTreeNode subTree) {          if (subTree != null) {              postOrder(subTree.getLeftNode());              postOrder(subTree.getRightNode());              System.out.println(subTree.getData());        }      }  

4.測試

public static void main(String[] args) {        BinaryTreeNode rootNode=new BinaryTreeNode(1);        rootNode.setLeftNode(new BinaryTreeNode(2));        rootNode.setRightNode(new BinaryTreeNode(3));        rootNode.getRightNode().setRightNode(new BinaryTreeNode(5));        rootNode.getRightNode().setLeftNode(new BinaryTreeNode(4));        rootNode.getRightNode().getLeftNode().setLeftNode(new BinaryTreeNode(6));        rootNode.getRightNode().getLeftNode().setRightNode(new BinaryTreeNode(7));        /*int depth=getDepth(rootNode);        System.out.println(depth);*/        visitBreadth(rootNode);    }

廣度優先遍曆結果:1 2 3 4 5 6 7

 

5.關於廣度優先遍曆

 

 廣度優先遍曆各個節點,需要使用到隊列(Queue)這種資料結構,queue的特點是先進先出,其實也可以使用雙端隊列,區別就是雙端隊列首位都可以插入和彈出節點。整個遍曆過程如下:

      首先將A節點插入隊列中,queue(A);

      將A節點彈出,同時將A的子節點B,C插入隊列中,此時B在隊列首,C在隊列尾部,queue(B,C);

      將B節點彈出,同時將B的子節點D,E插入隊列中,此時C在隊列首,E在隊列尾部,queue(C,D,E);

      將C節點彈出,同時將C的子節點F,G,H插入隊列中,此時D在隊列首,H在隊列尾部,queue(D,E,F,G,H);

      將D節點彈出,D沒有子節點,此時E在隊列首,H在隊列尾部,queue(E,F,G,H);

直到遍曆完成。需要藉助一個雙向隊列作為輔助空間存在。

資料結構--樹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.