1. 程式人生 > >實踐是最好的成長,發表是最好的記憶。

實踐是最好的成長,發表是最好的記憶。

樹的孩子兄弟連結串列儲存結構,採用兩條鏈分別連線孩子和兄弟結點。其中,child指向該結點的第一個孩子結點,sibling指向該結點的下一個兄弟結點。

public class Tree<T> {
	private TreeNode root;
	
	private class TreeNode<T>{		//樹的孩子兄弟連結串列結點類
		T data;
		TreeNode<T> child,sibling;	//分別指向孩子、兄弟結點
		
		public TreeNode() {
		}
		
		public TreeNode(T data){
			this(data,null,null);
		}
		
		public TreeNode(T data,TreeNode<T> child,TreeNode<T> sibling){
			this.data = data;
			this.child = child;
			this.sibling = sibling;
		}
	}
	
	public Tree() {
	}
	
	public boolean isEmpty(){
		return this.root == null;
	}
	
	//返回p結點最後一個兄弟結點
	public TreeNode<T> getLastSibling(TreeNode<T> p){
		if(p==null || p.sibling==null)
			return null;
		while(p.sibling!=null)
			p = p.sibling;
		return p;
	}
	
	//返回p結點的最後一個孩子
	public TreeNode<T> getLastChild(TreeNode<T> p){
		if(p==null || p.child==null)
			return null;
		p = p.child;
		while(p.sibling!=null)
			p = p.sibling;
		return p;
	}
	
	//插入x作為根結點
	public void insertRoot(T x){
		this.root = new TreeNode<T>(x,this.root,null);
	}
	
	//插入x作為p結點的最後一個兄弟結點
	public TreeNode<T> insertLastSibling(TreeNode<T> p,T x){
		if(p==null)
			return null;
		while(p.sibling!=null)
			p = p.sibling;
		p.sibling = new TreeNode<T>(x);
		return p.sibling;
	}
	
	//插入x作為p結點的最後一個孩子結點
	public TreeNode<T> insertLastChild(TreeNode<T> p,T x){
		if(p==null)
			return null;
		if(p.child==null){
			p.child = new TreeNode<T>(x);
			return p.child;
		}
		else
			return insertLastSibling(p.child,x);
	}
	
	//先根次序遍歷樹並返回樹的橫向凹入表示字串
	public String toString(){
		return toString(root,"");
	}
	//tab表示縮排量
	private String toString(TreeNode<T> p,String tab){
		if(p==null)
			return "";
		return tab+p.data.toString()+"\n"+toString(p.child,tab+"\t")+toString(p.sibling,tab);//遞迴呼叫
	}
	
	public Tree<String> make(){
		Tree<String> tree = new Tree<String>();
		tree.root = new TreeNode("中國");
		tree.insertLastChild(tree.root, "北京市");
		tree.insertLastChild(tree.root, "上海市");
		TreeNode js = tree.insertLastChild(tree.root, "江蘇省");
		tree.insertLastChild(js, "南京市");
		tree.insertLastChild(js, "蘇州市");
		TreeNode korea = tree.insertLastSibling(tree.root, "韓國");
		tree.insertLastChild(korea,"首爾");
		return tree;
	}
	
	public static void main(String[] args) {
		Tree<String> t = new Tree<String>();
		System.out.println(t.make());
	}
}