二叉树(一):先序遍历(递归和非递归)

一、二叉树先序遍历:头>左>右

1. 递归方式实现

 //先序打印 头左右
    public static void pre(Node head) {
        if (head == null) return;
        System.out.print(head.value + ", ");
        pre(head.left);
        pre(head.right);
    }

二、 非递归方式实现

使用栈集合存储节点数据,完成非递归实现

1. 数据结构

二叉树

1.1 . 将根节点 1 压入站内,进入循环后将 1 弹出栈并打印输出,利用栈后入先出的规则将右树3压入栈底,再将左树节点2压入栈,


1.2 进入下一轮循环,将节点2弹出栈并输出打印,并将节点2 的子节点5和4压入栈(先右后左)


1.3 进入下一轮循环,将节点4弹出栈并输入打印,发现其左子树节点和右子树节点都没值,不做任何操作。

1.4 进入下一轮循环,将节点5弹出栈并输入打印,发现其左子树节点和右子树节点都没值,不做任何操作。

1.5 左数整体遍历完毕,这时候栈内只有右数节点3,将其弹出栈并获取其右树节点和左树节点压入栈。

1.6 后面逻辑和1.1至1.5一样循环。代码如下:

 public static void pre(Node head) {
        System.out.println("pre----------------");
        //非空判断
        if (head != null) {
            // 定义一个栈集合
            Stack<Node> stack = new Stack<>();
            // 将根节点压入栈
            stack.push(head);
            //循环条件-栈内不为空的情况下继续循环
            while (!stack.isEmpty()) {
                //弹出一个node节点
                head = stack.pop();
                System.out.print(head.value + ", ");
                //判断当前的节点的右节点是否有值,有值压入栈
                if (head.right != null) {
                    stack.push(head.right);
                }
                //判断当前的节点的左节点是否有值,有值压入栈
                if (head.left != null) {
                    stack.push(head.left);
                }
            }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容