java創建二叉樹並遞歸遍歷二叉樹


二叉樹類代碼:

package binarytree;

import linkqueue.LinkQueue;

public class BinaryTree {

	class Node
	{
		public Object data;
		public Node lchild;
		public Node rchild;
		
		public Node(Object data)
		{
			this.data = data;
			this.lchild = null;
			this.rchild = null;
		}
	}

	//根節點
	private Node root = null;
	private Node node = null;
	/**
	 * 創建樹
	 * 
	 * 以完全二叉樹的格式來創建(子樹不存在的用0填充),
	 * 對完全二叉樹中每一個節點從0開始進行編號,
	 * 那么第i個節點的左孩子的編號為2*i+1,右孩子為2*i+2。
	 * 
	 * */
	void createTree(String strtree)
	{
		LinkQueue lQueue = new LinkQueue();
		lQueue.initQueue();
		/**
		 * 完全二叉樹中第i層的結點的個數最多為第1到i-1層上所有節點的個數和
		 * 所以父節點的個數最多為N-1個,N表示節點個數
		 * */
		for(int parentIndex =0; parentIndex<strtree.split(" ").length/2;parentIndex++)
		{
			if(root == null)
			{
				root= new Node(strtree.split(" ")[parentIndex]);
				//左孩子
				root.lchild = new Node(strtree.split(" ")[parentIndex*2+1]);
				lQueue.enQueue(root.lchild);
				//右孩子
				root.rchild = new Node(strtree.split(" ")[parentIndex*2+2]);
				lQueue.enQueue(root.rchild);
			}else
			{
				if(!lQueue.isEmpty() && parentIndex*2+1<strtree.split(" ").length)//隊列不空
				{
					node = (Node) lQueue.deQueue();
					if(parentIndex*2+1<strtree.split(" ").length)
					{
						//左孩子
						node.lchild = new Node(strtree.split(" ")[parentIndex*2+1]);
						lQueue.enQueue(node.lchild);
					}
					if(parentIndex*2+2<strtree.split(" ").length)
					{
						//右孩子
						node.rchild = new Node(strtree.split(" ")[parentIndex*2+2]);
						lQueue.enQueue(node.rchild);
					}
				}else
				{
					return;
				}
			}
		}
	}
	
	/**
	 * 先序遍歷二叉樹
	 * */
	void preOrderTraverse(Node node)
	{
		if(node == null)
		{
			return;
		}
		visit(node);
		preOrderTraverse(node.lchild);
		preOrderTraverse(node.rchild);
	}
	/**
	 * 中序遍歷二叉樹
	 * */
	void inOrderTraverse(Node node)
	{
		if(node == null)
		{
			return;
		}
		inOrderTraverse(node.lchild);
		visit(node);
		inOrderTraverse(node.rchild);
	}
	/**
	 * 后序遍歷二叉樹
	 * */
	void postOrderTraverse(Node node)
	{
		if(node == null)
		{
			return;
		}
		postOrderTraverse(node.lchild);
		postOrderTraverse(node.rchild);
		visit(node);
	}

	/**
	 * 打印二叉樹
	 * */
	public void print()
	{
		System.out.print("先序遍歷:");
		preOrderTraverse(root);
		System.out.print("\n中序遍歷:");
		inOrderTraverse(root);
		System.out.print("\n后序遍歷:");
		postOrderTraverse(root);
	}
	
	/**
	 * 訪問節點
	 * */
	private void visit(Node node)
	{
		if(!node.data.equals("0"))
		{
			System.out.print(node.data+" ");
		}
	}
}

測試代碼(以數據結構中表達式a+b*(c-d)-e/f為例):

package binarytree;

public class BinaryTreeMain {

	public static void main(String[] args) {
		BinaryTree binaryTree = new BinaryTree();
		
		String strtree="- + / a * e f 0 0 b - 0 0 0 0 0 0 0 0 0 0 c d";//0表示沒有值的位置
		binaryTree.createTree(strtree);
		
		binaryTree.print();
	}

}

 運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM