• 栈的问题


    前中后序遍历的递归与栈实现

    抛弃繁琐的代码,新建了一个数据结构MyNode,用于判断该结点是否被遍历过

    中序遍历

    public List<Integer> inorderTraversal2(TreeNode root) {
    
            List<Integer> list = new LinkedList<>();
    
            /**
             * 循环实现
             *
             * 一个最大的问题就是 可以这样做
             *
             * if(left!=null) addLast
             *
             * else print and right addLast
             *
             * 但是如果左孩子读完了,回到了父结点,那么就会再判断是否有左子树,死循环了
             *
             * 所以,要是有办法判断这些结点是应该遍历它的左子树还是直接打印就好了
             *
             * 所以新建了一个数据结构
             *
             * MyNode
             * bool check 真就是遍历过了,直接打印即可
             * TreeNode node 它对应的Node
             *
             */
    
    
            LinkedList<MyNode> stack = new LinkedList<>();
    
    
            MyNode node = new MyNode(root,false);
    
            stack.addLast(node);
    
            while (stack.size()!=0){
    
                MyNode temp = stack.pollLast();
    
                if(temp.node!=null){
    
                    //检查过了就直接打印就好了
                    if(temp.check){
    
                        list.add(temp.node.val);
    
                    }else{
    
                        //这个是待遍历的结点
                        stack.addLast(new MyNode(temp.node.right,false));
                        stack.addLast(new MyNode(temp.node,true));
                        stack.addLast(new MyNode(temp.node.left,false));
    
                    }
    
    
                }
    
            }
    
    
            return list;
        }
    

      

    后序遍历

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        
        public static class MyNode{
    
            boolean check;
            TreeNode node;
            MyNode(TreeNode node,boolean check){
                this.check = check;
                this.node = node;
            }
    
        }
        
        public List<Integer> postorderTraversal(TreeNode root) {
            
            List<Integer> list = new LinkedList<>();
    
            LinkedList<MyNode> stack = new LinkedList<>();
    
            MyNode node = new MyNode(root,false);
    
            stack.addLast(node);
    
            while(stack.size()!=0){
    
                MyNode temp = stack.pollLast();
    
                if(temp.node!=null){
    
                    if(temp.check){
                        list.add(temp.node.val);
                    }else{
    
                        stack.addLast(new MyNode(temp.node,true));
                        stack.addLast(new MyNode(temp.node.right,false));
                        stack.addLast(new MyNode(temp.node.left,false));
    
                    }
    
    
                }
    
    
            }
    
            return list;
            
        }
    }
    

      

    341

  • 相关阅读:
    Unity中传入任意数,转换成分,秒,并进行倒计时换算..(两种方式)
    Unity中调用手机中的粘贴功能
    关于Unity中IphoneX的适配
    可以接受多个字符串的可变参数
    可变参数函数示例
    多维数组指针指向引用问题
    printf的封装与实现
    关于MQTT的相关工具和使用(参考百度天工)
    单片机的堆和栈(Heap & Stack)详解
    单片机的内存分配(变量的存储位置)详解
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9097703.html
Copyright © 2020-2023  润新知