深度优先遍历 + 广度优先遍历

一、核心思想

1、深度优先搜索

用栈做辅助,做回溯判断(搜索到哪一点就push,回溯就pop),直至初始点也回溯完。

2.广度优先搜索

利用队列的先进先出特点,每一轮都将当前节点的儿子们放进队列,一轮遍历结束时,当前层的儿子们已经放入队列,重复下去。

二、代码

/**
 * 树节点结构
 */
class TreeNode {
    int data;
    TreeNode leftNode;
    TreeNode rightNode;
    public TreeNode() {
        
    }
    public TreeNode(int data) {
        this.data = data;
    }
    
    public TreeNode(TreeNode leftNode,TreeNode rightNode,int data) {
        this.leftNode = leftNode;
        this.rightNode= rightNode;
        this.data = data;
    }
}


public class Main {
    
    //广度优先遍历
    public void BroadFirstSearch(TreeNode nodeHead) {
        if(nodeHead == null) return;
        
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(nodeHead);
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            
            System.out.print(node.data + " ");
            
            if(null != node.leftNode) {
                queue.add(node.leftNode);
            }
            if(null != node.rightNode) {
                queue.add(node.rightNode);
            }
            
        }
    }
    
    //深度优先遍历
    public void depthFirstSearch(TreeNode nodeHead) {
        if(nodeHead == null) return;
        
        Stack<TreeNode> queue = new Stack<>();
        queue.add(nodeHead);
        while(!queue.isEmpty()) {
            TreeNode node=queue.pop();
            
            System.out.print(node.data + " ");
            
            if(node.rightNode != null) {
                queue.push(node.rightNode);
            }
            if(node.leftNode != null) {
                queue.push(node.leftNode);
            }
        }
        
    }
}

 

posted @ 2019-08-27 10:52  莹狼  阅读(214)  评论(0编辑  收藏  举报