二叉樹:在數據結構中,二叉樹是每一個節點最多有兩個子樹的樹結構。一般子樹被稱做爲java
「左子樹」和右子樹。二叉樹一般被用於實現二叉查找樹和二叉堆。node
二叉樹的每一個節點至多隻有兩顆子樹(不存在度大於2的結點),須要注意的是二叉樹的子樹數組
是有左右之分的,次序不能顛倒。其第i層最多有個結點;深度爲k的二叉樹最多有
數據結構
個結點;對於任意一顆二叉樹T,若是其葉子結點樹爲n0,度爲2的結點樹爲n2,則n0=n2 + 2(根結ide
點除外)。this
二叉樹能夠使用數組或者順序表來表示,這種實現方式更有利於緊湊的存儲和更好的訪問code
局部性,可是他須要連續的存儲空間,在極端的狀況下,若是一顆二叉樹只有右子樹,那麼空get
間的浪費將會異常的嚴重。it
二叉樹還能夠使用鏈表的存儲方式來實現,這也是推薦的實現方式。在Java中具體的樹節點class
的具體表示狀況以下:
class TreeNode<T> { private T data; private TreeNode<T> leftNode; private TreeNode<T> rightNode; public TreeNode(T data, TreeNode<T> leftNode, TreeNode<T> rightNode) { this.data = data; this.leftNode = leftNode; this.rightNode = rightNode; } }對於二叉樹的具體操做筆者不會去詳細的實現,感興趣的是二叉樹的遍歷方式。
對於二叉樹的遍歷方式通常分爲三種先序、中序、後序三種方式
若二叉樹爲空,則不進行任何操做:不然
一、訪問根結點。
二、先序方式遍歷左子樹。
三、先序遍歷右子樹。
若二叉樹爲空,則不進行任何操做:不然
一、中序遍歷左子樹。二、訪問根結點。
三、中序遍歷右子樹。
若二叉樹爲空,則不進行任何操做:不然
一、後序遍歷左子樹。二、後序遍歷右子樹。
三、放問根結點。
遍歷的狀況以下:
二叉樹遍歷的代碼實現:
package com.kiritor; /** * Java二叉樹的實現 以及遍歷 * * @author Kiritor */ public class BinaryTree { /** * 輸出結點信息*/ public void printNode(TreeNode<String> node) { System.out.print(node.getData()+" "); } /** * 定義結點 * */ class TreeNode<T> { private T data; private TreeNode<T> leftNode; private TreeNode<T> rightNode; public TreeNode(T data, TreeNode<T> leftNode, TreeNode<T> rightNode) { this.data = data; this.leftNode = leftNode; this.rightNode = rightNode; } public T getData() { return data; } public void setData(T data) { this.data = data; } public TreeNode<T> getLeftNode() { return leftNode; } public void setLeftNode(TreeNode<T> leftNode) { this.leftNode = leftNode; } public TreeNode<T> getRightNode() { return rightNode; } public void setRightNode(TreeNode<T> rightNode) { this.rightNode = rightNode; } } // 初始化二叉樹 public TreeNode<String> init() { TreeNode<String> D = new TreeNode<String>("D", null, null); TreeNode<String> H = new TreeNode<String>("H", null, null); TreeNode<String> I = new TreeNode<String>("I", null, null); TreeNode<String> J = new TreeNode<String>("J", null, null); TreeNode<String> P = new TreeNode<String>("P", null, null); TreeNode<String> G = new TreeNode<String>("G", P, null); TreeNode<String> F = new TreeNode<String>("F", null, J); TreeNode<String> E = new TreeNode<String>("E", H, I); TreeNode<String> B = new TreeNode<String>("B", D, E); TreeNode<String> C = new TreeNode<String>("C", F, G); TreeNode<String> A = new TreeNode<String>("A", B, C); return A; } /**先序遍歷二叉樹 * */ public void xianIterator(TreeNode<String> node) { this.printNode(node); if(node.getLeftNode()!=null) { this.xianIterator(node.getLeftNode()); } if(node.getRightNode()!=null) { this.xianIterator(node.getRightNode()); } } /** * 中序遍歷二叉樹*/ public void zhongIterator(TreeNode<String> node) { if(node.getLeftNode()!=null) { this.zhongIterator(node.getLeftNode()); } this.printNode(node); if(node.getRightNode()!=null) { this.zhongIterator(node.getRightNode()); } } /**後序遍歷二叉樹*/ public void houIterator(TreeNode<String> node) { if(node.getLeftNode()!=null) { this.houIterator(node.getLeftNode()); } if(node.getRightNode()!=null) { this.houIterator(node.getRightNode()); } this.printNode(node); } public static void main(String[] args) { BinaryTree binaryTree = new BinaryTree(); TreeNode<String> node = binaryTree.init(); System.out.println("先序遍歷的狀況"); binaryTree.xianIterator(node); System.out.println("\n中序遍歷的狀況"); binaryTree.zhongIterator(node); System.out.println("\n後序遍歷的狀況"); binaryTree.houIterator(node); } }