標籤: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);
直到遍曆完成。需要藉助一個雙向隊列作為輔助空間存在。
資料結構--樹