论坛首页 综合技术论坛

树形显示

浏览 2101 次
锁定老帖子 主题:树形显示
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-17  

/** 
树形结构应用十分广泛。
下面这段代码根据用户添加的数据,在内存中构建一个逻辑上等价的树形结构。
通过ShowTree() 可以把它显示为控制中的样子。
其中:
  a.add('a', 'b');
  a.add('b', 'e');
表示:'b' 作为 'a' 的孩子节点;'e' 作为 'b'的孩子节点。
如代码中给出的示例数据,输出结果应该为:
a--b--e
|  |--f--j
|     |--k
|--c
|--d--g--h
   |--i
   
 */

import java.util.*;
class MyTree
{
	private Map map = new HashMap();
	
	public void add(char parent, char child)
	{
		List<Character> t = (List<Character>)map.get(parent);
		if(t==null)
		{
			t = new Vector<Character>();
			map.put(parent, t);  //
		}
		t.add(child);
	}
	
	public List<Character> getChild(char x)
	{
		return (List<Character>)map.get(x);
	}
}

public class My
{
	public static List<String> showTree(MyTree tree, char x)
	{
		List<Character> t = tree.getChild(x);//x的孩子节点的集合t
		
		List<String> r = new Vector<String>();
		
		if(t==null)
		{
			r.add("" + x);
			return r;
		}
				
		for(int i=0; i<t.size(); i++)
		{
			List<String> ri = showTree(tree, t.get(i));//递归t中每个元素的求他们的孩子节点
			for(int j=0; j<ri.size(); j++)
			{
				String pre = "|  ";
				if(j==0)
				{
					if(i==0)
						pre = x + "--";
					else 
						pre = "|--";
				}
				else
				{
					if(i==ri.size())    // 
						pre = "   ";
					else
						pre = "|  ";
				}
				
				r.add(pre + ri.get(j));
			}
		}
		
		return r;
	}
	
	public static void main(String[] args)
	{
		MyTree a = new MyTree();
		a.add('a', 'b');
		a.add('b', 'e');
		a.add('b', 'f');
		a.add('a', 'c');
		a.add('a', 'd');
		a.add('d', 'g');
		a.add('d', 'i');
		a.add('g', 'h');
		a.add('f', 'j');
		a.add('f', 'k');
		
		List<String> lst = showTree(a, 'a');
		for(int i=0; i<lst.size(); i++)
		{
			System.out.println(lst.get(i));
		}
	}
}
 
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics