加载中...

二叉树的遍历

二叉树的遍历(递归与非递归)

前序遍历/深度优先遍历(递归)

  • 如图
 public static void dfs(Node treeNode) {
        if (treeNode) {
            System.out.println(treeNode.data);//调整输出语句的前中后位置,实现前序,中序,dsf(treeNode.left);
            dfs(treeNode.left);
            dfs(treeNode.right);
        }
    }

前序遍历/深度优先遍历(非递归)

  • 使用栈来存储节点,现将根节点压栈,然后进入while,然后弹栈检查此节点是否还有未遍历的节点,有的话先压右,后压左(因为栈先进后出,保证了先遍历左枝),没有的话不断回溯(出栈)
public static void dfsStack(Node root) {
        Stack<Node> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            Node treeNode = stack.pop();
            System.out.println(treeNode.data);
            if (treeNode.right != NUll) {
                stack.push(treeNode.right);
            }
            if (treeNode.left != NUll) {
                stack.push(treeNode.left);
            }
        }
    }

广度优先遍历/层序遍历

  • 如图
  • 用队列存储节点,现将根节点压入队列,然后进入while,然后出队列检查左右儿子节点是否存在,有的话先压左,后压右(因为队列先进先出,保证了先遍历左枝),把队列遍历为空截止
    public static void bfs(Node root) {
        Queue<Node> queue = new LinkedList<>();
        queue.push(root);
        while (!queue.isEmpty()) {
            Node treeNode = queue.pop();
            System.out.println(treeNode.data);
            if (treeNode.left != NUll) {
                stack.push(treeNode.left);
            }
            if (treeNode.right != NUll) {
                stack.push(treeNode.right);
            }
        }
    }
posted @ 2021-09-27 11:18  阿根廷胖头鱼  阅读(78)  评论(0)    收藏  举报