深度优先和广度优先搜索算法

深度优先和广度优先搜索算法

1、先构建子节点以及子节点构成的二叉树

//定义一个节点,节点连接有左节点和右节点
public class TreeNode {
    public int data;
    public TreeNode lift;
    public TreeNode right;

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

}
//构建一个二叉树
//先构建一个二叉树
        TreeNode head = new TreeNode(1);
        TreeNode two = new TreeNode(2);
        TreeNode three = new TreeNode(3);
        TreeNode four = new TreeNode(4);
        TreeNode five = new TreeNode(5);
        TreeNode six = new TreeNode(6);
        TreeNode seven = new TreeNode(7);
        head.lift = two;
        head.right = three;
        two.lift = four;
        two.right = five;
        three.lift = six;
        three.right = seven;

2、广度优先:

广度优先使用了队列结构,先将顶点放入队列中,然后在弹出顶点的同时判断该顶点的左节点是否为空,否,则加入队列,再判断该顶点的右节点是否为空,否,则将右节点加入到队列中。此时该顶点的左右节点依次进入队列中,先进先出,再弹出左节点的时候判断其左右节点是否为空,否,则依次加入队列,然后弹出右节点,判断其左右节点。这样依次循环下去,就能一层一层从左到右输出所有节点的信息。

//广度优先
    public static void boardFirstSearch(TreeNode node){
        if (node == null){
            return;
        }
        Queue<TreeNode> myQueue = new LinkedList<>();
        myQueue.add(node);
        while (!myQueue.isEmpty()){
            TreeNode treeNode = myQueue.poll();
            System.out.print(treeNode.data+" ");
            if (treeNode.lift != null){
                myQueue.add(treeNode.lift);
            }
            if (treeNode.right != null){
                myQueue.add(treeNode.right);
            }
        }
    }

3、深度优先:

深度优先使用了栈数据结构,即先进后出。先将顶点压入栈中,然后弹出,由于栈的结构是先进后出,因此需要先判断右边,如果右节点不为空,则入栈,然后判断左节点是否为空,否,则将左节点入栈,然后此时弹出左节点,再判断左节点的右节点、左节点是否为空,依次压入中中。这就导致了每次入栈都是先压入右节点,先弹出左节点。所以出栈的顺序就是先输出栈的最靠左一列的节点信息。

//深度优先
    public static void deepFirstSearch(TreeNode node){
        if (node == null){
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.add(node);
        while (!stack.isEmpty()){
            TreeNode node1 = stack.pop();
            System.out.print(node1.data+" ");
            if (node1.right != null){
                stack.add(node1.right);
            }
            if (node1.lift != null){
                stack.add(node1.lift);
            }
        }
    }

4、代码结果

1 2 3 4 5 6 7 
1 2 4 5 3 6 7 

}
}
}


### 4、代码结果

```java
1 2 3 4 5 6 7 
1 2 4 5 3 6 7 

代码结果的显示:广度优先算法是每一层从左往右依次输出;深度优先算法则是先输出左边一列的节点信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值