用java实现数的深度遍历和广度遍历

package org.algo;

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack;

/**
 * 树深度/广度遍历
 * Created with IntelliJ IDEA.
 * Date: 16-3-21
 * Time: 下午5:16
 * To change this template use File | Settings | File Templates.
 */
public class TreeTraversal {

    /**
     * 树节点
     */
    public static class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;

        public TreeNode() {

        }

        public TreeNode(int value) {
            this.value = value;
        }

        public void visit() {
            System.out.print(value + " ");
        }
    }

    /**
     * 深度遍历
     * @param root
     */
    public static void breadth1stTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        Queue<TreeNode> treeNodeQueue = new ArrayDeque<TreeNode>();
        treeNodeQueue.add(root);
        while (!treeNodeQueue.isEmpty()) {
            TreeNode node = treeNodeQueue.poll();
            node.visit();
            if (node.left != null) {
                treeNodeQueue.add(node.left);
            }
            if (node.right != null) {
                treeNodeQueue.add(node.right);
            }
        }
    }

    /**
     * 广度遍历
     * @param root
     */
    public static void depth1stTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        Stack<TreeNode> treeNodeStack = new Stack<TreeNode>();
        treeNodeStack.push(root);
        while (!treeNodeStack.isEmpty()) {
            TreeNode node = treeNodeStack.pop();
            node.visit();
            if (node.right != null) {
                treeNodeStack.push(node.right);
            }
            if (node.left != null) {
                treeNodeStack.push(node.left);
            }
        }
    }

    /**
     * 构建测试用的树
     *         1
     *        / \
     *       2  3
     *      / \
     *     4   5
     *          \
     *           6
     * @return
     */
    public static TreeNode buildTestTree() {
        TreeNode treeNode1 = new TreeNode(1);
        TreeNode treeNode2 = new TreeNode(2);
        TreeNode treeNode3 = new TreeNode(3);
        TreeNode treeNode4 = new TreeNode(4);
        TreeNode treeNode5 = new TreeNode(5);
        TreeNode treeNode6 = new TreeNode(6);
        treeNode1.left = treeNode2;
        treeNode1.right = treeNode3;
        treeNode2.left = treeNode4;
        treeNode2.right = treeNode5;
        treeNode5.right = treeNode6;
        return treeNode1;
    }

    /**
     * 结果是:
     * 1 2 3 4 5 6
     */
    public static void testBreadth1stTraversal() {
        breadth1stTraversal(buildTestTree());
    }

    /**
     * 结果是:
     * 1 2 4 5 6 3
     */
    public static void testDepth1stTraversal() {
        depth1stTraversal(buildTestTree());
    }

    /**
     * 测试例程
     * @param args
     */
    public static void main(String[] args) {
        testBreadth1stTraversal();
        System.out.println();
        testDepth1stTraversal();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现连通图的深度优先遍历广度优先遍历的示例代码: 1. 深度优先遍历(DFS): ```java import java.util.*; class Graph { private int V; // 顶点的个 private LinkedList<Integer> adj[]; // 邻接表 // 构造函 Graph(int v) { V = v; adj = new LinkedList[v]; for (int i = 0; i < v; ++i) adj[i] = new LinkedList(); } // 添加边 void addEdge(int v, int w) { adj[v].add(w); } // 递归函,于深度优先遍历 void DFSUtil(int v, boolean visited[]) { visited[v] = true; System.out.print(v + " "); Iterator<Integer> i = adj[v].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) DFSUtil(n, visited); } } // 对给定的顶点进行深度优先遍历 void DFS(int v) { boolean visited[] = new boolean[V]; DFSUtil(v, visited); } } public class Main { public static void main(String args[]) { Graph g = new Graph(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); System.out.println("深度优先遍历结果:"); g.DFS(2); } } ``` 输出结果: ``` 深度优先遍历结果: 2 0 1 3 ``` 2. 广度优先遍历(BFS): ```java import java.util.*; class Graph { private int V; // 顶点的个 private LinkedList<Integer> adj[]; // 邻接表 // 构造函 Graph(int v) { V = v; adj = new LinkedList[v]; for (int i = 0; i < v; ++i) adj[i] = new LinkedList(); } // 添加边 void addEdge(int v, int w) { adj[v].add(w); } // 对给定的顶点进行广度优先遍历 void BFS(int s) { boolean visited[] = new boolean[V]; LinkedList<Integer> queue = new LinkedList<Integer>(); visited[s] = true; queue.add(s); while (queue.size() != 0) { s = queue.poll(); System.out.print(s + " "); Iterator<Integer> i = adj[s].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) { visited[n] = true; queue.add(n); } } } } } public class Main { public static void main(String args[]) { Graph g = new Graph(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); System.out.println("广度优先遍历结果:"); g.BFS(2); } } ``` 输出结果: ``` 广度优先遍历结果: 2 0 3 1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值