树的广度深度优先遍历

4个类,其中stack / queue 是借用的,

Stack 类

package AlgorithmGraph;

/** 
 * 栈,遵循先进后出的原则,用来保存元素 
 *  
 * @author jalo 
 *  
 */  
public class Stack {
	  
    private int[] st;  
    private int top;  
    private int count;  
  
    /** 
     * 构造一个栈 
     *  
     * @param size 
     *  栈的大小 
     */  
    public Stack(int size) {  
        st = new int[size];  
        top = -1;  
        count = 0;  
    }  
  
    /** 
     * 元素进栈 
     *  
     * @param j 
     *            要进栈的元素 
     */  
  
    public void push(int j) {  
        count++;  
        st[++top] = j;  
    }  
  
    /** 
     * 元素出栈 
     *  
     * @return 出栈的元素 
     */  
  
    public int pop() {  
  
        return st[top--];  
    }  
  
    /** 
     * 查询栈顶元素 
     *  
     * @return 栈顶元素 
     */  
  
    public int peek() {  
        return st[top];  
    }  
  
    /** 
     * 查询栈是否为空 
     *  
     * @return 栈是否为空 
     */  
  
    public boolean isEmpty() {  
        count--;  
        return (top == -1);  
    }  
  
    /** 
     * 查看栈里的所有元素 
     */  
  
    public void list() {  
  
        for (int i = 0; i < count; i++) {  
  
            System.out.print(st[i] + "   ");  
  
        }  
        System.out.println();  
    }  
  
    /** 
     * 得到栈里一共有多少元素 
     *  
     * @return 栈里的元素个数 
     */  
    public int getCount() {  
        return count;  
    }  
  
    /** 
     * 查看栈里是否包含某个元素 
     *  
     * @param i 
     *            要查询的元素 
     * @return 是否包含了要查询的元素 
     */  
  
    public boolean isContains(int i) {  
        for (int k = 0; k < st.length; k++) {  
  
            System.out.print("开始比较" + i + "此时的result:");  
            list();  
            System.out.println();  
            if (st[k] == i) {  
                return true;  
            }  
        }  
        return false;  
    }  
      
    /** 
     * 得到栈里的元素集 
     * @return 栈里的元素集合 
     */  
    public int[] getSt(){  
        return st;  
    }  
  
}

Queue 类

package AlgorithmGraph;

public class Queue {
	  
    private int[] values;  
    private int begin = -1;  
    private int end = -1;  
      
    Queue(int size){  
        values = new int[size];  
    }  
      
    void push(int value){  
        values[++begin] = value;  
    }  
      
    int pop(){  
        return values[++end];  
    }  
      
    boolean isEmpty(){  
        return begin == end;  
    }  
}
Graph 类

package AlgorithmGraph;

import java.util.Vector;

public class Graph {
	
	Stack stack ; //做中转
	Stack result;
	Queue queue ;
	int vertexNum;	//图的顶点数 
	Vector vector[];  //邻接矩阵
	int visited[];
	
	public Graph(int num) {  //顶点数
		super();
		vertexNum = num;
		vector = new Vector[num];
		visited = new int[num];
		for(int i=0;i<num;i++)
			visited[i] = 0;
		stack = new Stack(num);
		result = new Stack(num);
		queue = new Queue(num);
	}
	
	public boolean addEdge(int I, int J) {
		if(I == J) return false;
		if(I>=0 && I < vertexNum && J>=0 && J < vertexNum) {
			if(I>J) {
				int k = I;
				I = J;
				J = k;
			}
			if(isEdgeExists(I,J)) 
				return false;
			vector[I].add(new Integer(J));
			return true;
		}
		return false;
	}
	
	public boolean isEdgeExists(int I, int J) {
		if(I>=0 && I < vertexNum && J>=0 && J < vertexNum) {
			if(I>J) {
				int k = I;
				I = J;
				J = k;
			}
			if(vector[I] == null) 
				vector[I] = new Vector(9);
			for(int q=0;q<vector[I].size();q++) {
				if(((Integer)vector[I].get(q)).intValue() == J) {
					System.out.println("顶点"+I+" 和 "+J +"之间存在边");
					return true;
				}
			}
		}
		return false;
	}
	
	//深度优先遍历,思路,最开始邻接顶点一直往中转栈里面进,直到某个顶点没有邻接顶点,则栈顶(无邻接顶点的点)元素出栈,继续判断是否有邻接顶点
	public void dfs() {  
		visited[0] = 1;
		stack.push(0);
		while(!stack.isEmpty()) {
			int vertex = getAdjUnvisitedVertex(stack.peek());
			if(vertex != -1) {
				visited[vertex]=1;
				stack.push(vertex);
			} else {
				result.push(stack.peek());
				stack.pop();
			}
		}
		System.out.println("进行深度优先遍历的顺序为: ");
		while(!result.isEmpty())
			System.out.print(result.pop() + "  ");
		//result.list();
	}
	
	//广度优先遍历,思路:循环条件是队不为空,队首出队,把它的所有邻接顶点入队,循环。
	public void bsf(){  
		visited[0] = 1;
		queue.push(0);
		while(!queue.isEmpty()) {
			int vertex = queue.pop();
			result.push(vertex);
			int k;
			while((k=getAdjUnvisitedVertex(vertex))!=-1) {
				visited[k] = 1;
				queue.push(k);
			}
		}
		System.out.println("广度优先遍历:");
		result.list();
	}
	
	//得到指定节点未被访问的邻接点位置
	public int getAdjUnvisitedVertex(int v) {
		int temp;
		if(vector[v]!=null) {
			for(int j=0;j<vector[v].size();j++) {
				temp = ((Integer)vector[v].get(j)).intValue();
				if(visited[temp]==0) {
					return temp;
				}
			}
		}
		return -1;
	}
}


TestGraph 类

package AlgorithmGraph;

public class TestGraph {
	
	public static void main(String[] args) {
		Graph graph = new Graph(12);
		graph.addEdge(0, 2);
		graph.addEdge(0, 3);
		graph.addEdge(2, 4);
		graph.addEdge(2, 5);
		graph.addEdge(3, 8);
		graph.addEdge(3, 9);
		graph.addEdge(4, 6);
		graph.addEdge(4, 7);
		graph.addEdge(9, 10);
		graph.addEdge(9, 11);
		graph.dfs();
		
//		graph.addEdge(0, 1);
//		graph.addEdge(1, 2);
//		graph.addEdge(2, 3);
//		graph.addEdge(2, 4);
//		graph.addEdge(2, 5);
//		graph.addEdge(2, 6);
//		graph.addEdge(3, 7);
//		graph.bsf();
	}
}

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值