美文网首页
非递归实现二叉树排序

非递归实现二叉树排序

作者: 涣涣虚心0215 | 来源:发表于2022-02-18 02:26 被阅读0次

    非递归的方式实现二叉树先序,中序,后序遍历,就需要借助栈来进行帮助。
    尤其在做后序遍历的时候,需要两个栈来进行协同(主要就是右子树要比根结点先入栈,这样才能保证根结点在右子树之后遍历出来)。

        @Override
        public void preOrderByStack() {
            System.out.println("Start preOrderByStack");
            Deque<Node> stack = new LinkedList<>();
            Node current = root;
            while (null != current || !stack.isEmpty()) {
                while (null != current) {
                    System.out.print(current.getData() + " ");
                    if (null != current.getRightChild())
                        stack.push(current.getRightChild());
                    current = current.getLeftChild();
                }
                if (!stack.isEmpty()) {
                    current = stack.pop();
                }
            }
        }
    
        @Override
        public void innerOrderByStack() {
            System.out.println("Start innerOrderByStack");
            Deque<Node> stack = new LinkedList<>();
            Node current = root;
            while (null != current || !stack.isEmpty()) {
                while (null != current) {
                    stack.push(current);
                    current = current.getLeftChild();
                }
                if (!stack.isEmpty()) {
                    current = stack.pop();
                    System.out.print(current.getData() + " ");
                    current = current.getRightChild();
                }
            }
        }
    
        @Override
        public void postOrderByStack() {
            System.out.println("Start postOrderByStack");
            Deque<Node> stack1 = new LinkedList<>();
            Deque<Node> stack2 = new LinkedList<>();
            Node current = root;
            while (null != current || !stack1.isEmpty()) {
                while (null != current) {
                    stack1.push(current);
                    stack2.push(current);
                    current = current.getRightChild();
                }
    
                current = stack1.pop();
                current = current.getLeftChild();
            }
            while (!stack2.isEmpty()){
                System.out.print(stack2.pop().getData() + " ");
            }
        }
    
        @Override
        public void levelOrderByStack() {
            System.out.println("Start levelOrderByStack");
            Queue<Node> queue = new LinkedList<>();
            queue.add(root);
    
            while (queue.size() != 0) {
                int len = queue.size();
                for (int i = 0; i < len; i++) {
                    Node temp = queue.poll();
                    System.out.print(temp.getData() + " ");
                    if (null != temp.getLeftChild()) {
                        queue.add(temp.getLeftChild());
                    }
                    if (null != temp.getRightChild()) {
                        queue.add(temp.getRightChild());
                    }
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:非递归实现二叉树排序

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