二叉树非递归先中后序遍历

二叉树

非递归先中后序遍历

思路来源

一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到

笔记内容

  • 问题描述

    给定一个二叉树头结点,使用非递归的方式进行分别先中后序遍历。

  • 算法思路

    使用栈结构实现非递归遍历

    • 先序遍历:创建一个栈,每次弹出一个结点并打印。若该结点含有孩子,按先右后左的顺序压入栈,若没有则直接弹出。
    • 中序遍历:创建两个栈stack和result。首先在stack中压入从头结点开始的左边界,并依次取出一个结点,压入result栈中。若该结点含有孩子,则stack压入子结点的左边界。直到stack为空,打印result中所有结点。
    • 后序遍历:与先序遍历类似,但同样需要创建result栈,stack栈弹出的结点不直接打印,而是压入result栈中。直到stack为空,打印result中所有结点。
  • 代码实现

    /**
    class MyNode {
        public int num;
        public MyNode left;
        public MyNode right;
    
        public MyNode(int num, MyNode left, MyNode right) {
            this.num = num;
            this.left = left;
            this.right = right;
        }
    }
    */
    
    //先序遍历
        public static void Non_recursive_precedence(MyNode head){
            Stack stack = new Stack();
            stack.add(head);
            while (!stack.empty()){
                MyNode node = (MyNode) stack.pop();
                System.out.println(node.num);
                if(node.right != null){
                    stack.add(node.right);
                }
                if(node.left != null){
                    stack.add(node.left);
                }
            }
        }
    
        //中序遍历
        public static void Non_recursive_middle_order(MyNode head){
            Stack stack = new Stack();
            Stack result = new Stack();
            while (head != null){
                stack.add(head);
                head = head.left;
            }
            while (!stack.isEmpty()){
                MyNode node = (MyNode) stack.peek();
    
                    MyNode node1 = (MyNode) stack.pop();
                    result.add(node1);
    
                 if(node.right != null){
                    node = node.right;
                    while (head != null){
                        stack.add(head);
                        head = head.left;
                    }
                    }
                }
            }
    
        //后续遍历
        public static void Non_recursive_postorder(MyNode head){
            Stack stack = new Stack();
            Stack result = new Stack();
            stack.add(head);
            while (!stack.isEmpty()){
                MyNode node = (MyNode) stack.pop();
                result.add(node);
                if(node.left != null){
                    stack.add(node.left);
                }
                if(node.right != null){
                    stack.add(node.right);
                }
            }
            while (!result.isEmpty()){
                MyNode node = (MyNode)result.pop();
                System.out.println(node.num);
            }
        }
    
posted @ 2024-01-03 11:34  Noule  阅读(3)  评论(0编辑  收藏  举报