美文网首页
二叉树的递归和非递归遍历

二叉树的递归和非递归遍历

作者: 我是啵啵 | 来源:发表于2020-02-26 15:16 被阅读0次
package tree;

import java.util.Stack;

class treenode<T> {
    T value;
    treenode left;
    treenode right;

    public treenode(T value) {
        this.value = value;
    }
}

public class treebianli {
    public static void main(String[] args) {
        treenode node1 = new treenode(1);
        treenode node2 = new treenode(2);
        treenode node3 = new treenode(3);
        treenode node4 = new treenode(4);
        node1.left = node2;
        node1.right = node3;
        node2.left = node4;
        pre(node1);
//        preunrecur(node1);
//        posunrecur(node1);

        inunrecur(node1);
    }

    //递归
    static void pre(treenode root) {
        if (root == null) {
            return;
        }
        pre(root.left);
        System.out.print(root.value);
        pre(root.right);


    }

    //二叉树非递归遍历
    static void preunrecur(treenode root) {
        System.out.println("二叉树非递归遍历");
        if (root == null) {
            return;
        }
        Stack<treenode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {//栈为空就截至循环
            treenode treenode = stack.pop();
            System.out.print(treenode.value);//出栈打印!!
            if (treenode.right != null) {//先看右子树 不为空就压栈
                stack.push(treenode.right);
            }
            if (treenode.left != null) {//再看左子树 不为空就压栈
                stack.push(treenode.left);
            }
        }
    }

    static void inunrecur(treenode root) {
        System.out.println("中序非递归-----");
        if (root == null) {
            return;
        }
        Stack<treenode> stack = new Stack<>();
        treenode node = root;
        while (!stack.isEmpty() || node != null) {
            if (node != null) {//左边不为空就一直向下
                stack.push(node);
                node = node.left;
            } else {//左边为空 先出栈打印 然后node指向出栈节点的右边
                treenode pop = stack.pop();
                System.out.print(pop.value);
                node = pop.right;
            }
        }
    }

    static void posunrecur(treenode root) {//后序  把先序左右换过来 然后拿一个栈来存最后打印
        System.out.println("非递归后序遍历");
        if (root == null) {
            return;
        }
        Stack<treenode> stack1 = new Stack<>();
        stack1.push(root);//坑! 先把根节点压进去
        Stack<treenode> stack2 = new Stack<>();
        while (!stack1.isEmpty()) {
            treenode treenode = stack1.pop();
            stack2.push(treenode);//存入另外一个栈
            if (treenode.left != null) {//先进左 再进右
                stack1.push(treenode.left);
            }
            if (treenode.right != null) {
                stack1.push(treenode.right);
            }
        }
        while (!stack2.isEmpty()) {
            System.out.print(stack2.pop().value);
        }
    }
}


中序遍历多给一条指针parent
区别: 就是打印时你要判断一下是 不是左边上来的 是左边上来的话就要打印;

package tree;

import java.util.LinkedList;

public class treewidth {

    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }


    //二叉树的宽度优先遍历
    static void width(Node root) {
        if (root == null) {
            return;
        }
        LinkedList<Node> queue = new LinkedList<Node>();
//用linkedlist 当作队列 先进先出
        queue.add(root);
        while (!queue.isEmpty()) {
            Node node = queue.poll();
            System.out.print(node.value);
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
    }

    public static void main(String[] args) {
        Node node = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);
        Node node7 = new Node(7);
        Node node8 = new Node(8);
        node.left = node2;
        node.right = node3;
        node2.right = node4;
        node2.left = node5;
        node3.right = node6;
        node5.left = node7;
        width(node);
    }
}


//变式 统计最大宽度

相关文章

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 二叉树递归非递归遍历算法整理

    一、二叉树前序遍历 1 前序递归遍历 2.前序非递归遍历 一、二叉树中序遍历 2.中序递归遍历 1.中序非递归遍历...

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 二叉树遍历

    二叉树的遍历 1. 前序遍历 1.1 递归前序遍历 1.2 非递归前序遍历 2 中序遍历 2.1递归遍历 2.2非...

  • 二叉树的相关操作(一)

    上次写了二叉树遍历,其中在非递归的遍历中,只写了前序遍历,没有写非递归中序遍历和后续遍历。非递归要用到栈,只要根据...

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 2020-09-23

    二叉树前序遍历几种写法 递归 非递归

  • Java 二叉树递归与非递归所有遍历

    二叉树的递归与非递归遍历 PS:非递归遍历搞得头脑发晕.... 参考文献 :左神的书

网友评论

      本文标题:二叉树的递归和非递归遍历

      本文链接:https://www.haomeiwen.com/subject/jgwvchtx.html