1. 程式人生 > >java建立普通二叉樹

java建立普通二叉樹

    這段時間一直在複習資料結構的知識。從最基礎的開始,實現一個普通的二叉樹。但發現也不那麼簡單。因為之前學資料結構時是用C語言寫的。指標用來對結構體的值操作比較好理解。但java沒有指標。而Node節點在方法中傳遞的是地址。如果直接對形參進行new操作是錯誤的。無法改變實參的值的。這一點坑了我很久,然後一頓查資料。

  • 一個方法不能修改一個基本資料型別的引數
  •  一個方法可以修改一個物件引數的狀態
  • 一個方法不能實現讓物件引數引用一個新物件(這句話在這裡尤為適用)

    下面是非常簡單的實現

package tree.binarytree;

class Node{

	String data;
	private Node lchild;
	private Node rchild;
	Node(String data){
		this.data = data;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	public Node getLchild() {
		return lchild;
	}
	public void setLchild(Node lchild) {
		this.lchild = lchild;
	}
	public Node getRchild() {
		return rchild;
	}
	public void setRchild(Node rchild) {
		this.rchild = rchild;
	}
}



public class BinaryTree {
	
	private static Node root; 
	private static String [] treeNodes;
	static int index;
	
	public BinaryTree(String tree) {
		root = new Node("");
		treeNodes = tree.split(",");		
		index = 0;
		createTree(root);
	}
	/**
	 * 先序建立 
	 */
	public static Node createTree(Node node) {	
		
		String data = treeNodes[index];
		System.out.println("index "+index+" data "+data);
		index++;
		
		if(data.equals("#")){
			return null;		
		}
		else {
			//node.setData(data);//並沒有將Node賦值過去 是因為java傳的是值
			//new 之後地址不再是原來的了
			node.setData(data);;
			node.setLchild(createTree(new Node("")));
			node.setRchild(createTree(new Node("")));
			return node;
		}
	
	} 

	public Node getRoot() {
		return root;
	}
}

下面是寫的測試類

package tree.binarytree;

public class BinaryTreeTest {

	public static void main(String[] args) {
		BinaryTree tree = new BinaryTree("A,B,#,D,#,#,C,#,#");
		Node node = tree.getRoot();
		System.out.println(node.getData());
	}

}

    下週有空把樹的基本操作寫一下。