二叉樹的實現及先序、中序、後序遍歷

        定義

                    二叉樹:在數據結構中,二叉樹是每一個節點最多有兩個子樹的樹結構。一般子樹被稱做爲java

             「左子樹」和右子樹。二叉樹一般被用於實現二叉查找樹和二叉堆。node

        特色

                  二叉樹的每一個節點至多隻有兩顆子樹(不存在度大於2的結點),須要注意的是二叉樹的子樹數組

             是有左右之分的,次序不能顛倒。其第i層最多有2^{i-1}個結點;深度爲k的二叉樹最多有2^k-1數據結構

             個結點;對於任意一顆二叉樹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); 	} 	 } 
                    
相關文章
相關標籤/搜索