非递归遍历二叉树(数据结构)

|-------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 我的博客主页 |

非递归遍历二叉树

二叉树的遍历方式有:前序遍历、中序遍历、后续遍历,层序遍历,而树的大部分情况下都是通过递归的方式来进行的。
首先要明白递归是函数自身调用自身,设计了很多因素记录树中遍历的入栈 记录地址等。。。因为是在栈上开辟空间,这些操作对于时间和空间的消耗会更大,且容易溢出。迭代(非递归)它是在栈堆中开辟更大的空间,不容易溢出,且不会调用函数自身,效率也会提升很多。

更多的二叉树的oj题目在我的专栏中,感谢大家的观看
在数据结构中的学习难免少不了递归的学习,递归有时候也会让代码变得更加简洁,学习递归让我们对代码有更近一步的思考。

前序遍历(迭代)

每遍历一个节点打印一次元素且将其放入栈中,直到为空时,将栈顶元素移除来并打印并让其查看另一子树是否为空节点。

java 复制代码
   public static void preOrderIteration(TreeNode root){
        if(root==null)return ;//根节点没有属性
        Stack<TreeNode> stack=new Stack<>();
        TreeNode cur=root;
        while(cur!=null||!stack.isEmpty()){
            while(cur!=null){
                stack.push(cur);
                System.out.print(cur.val+" ");
                cur=cur.left;
            }
            cur=stack.pop();//将从栈中弹出的元素给到cur
            cur=cur.right;//cur的右边赋值给cur是否为空
        }
    }

中序遍历(迭代)

因为中序遍历是左根右,给定一个辅助栈,每次走到最后一个节点的left或者right为空时将栈中的元素给到数组,然后再去遍历栈顶右边元素是否为空。

java 复制代码
public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new LinkedList<>();
        Stack<TreeNode> stack=new Stack<>();
        while(root!=null||!stack.isEmpty()){
            if(root!=null){
                stack.push(root);
                root=root.left;
            }else{
                //如果为null说明该节点的左子树为空,将栈顶元素放入数组中
                list.add(stack.peek().val);
                //检查栈顶的右节点
                root = stack.pop().right;
            }
        }
        return list;
    }

后续遍历(迭代)

java 复制代码
   public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list=new LinkedList<>();
        if(root==null)return list;
        Stack<TreeNode> stack=new Stack<>();
         TreeNode prev=null;//记录上一个移除栈的元素
        while(root!=null||!stack.isEmpty()){
            while(root!=null){
            stack.push(root);
            root=root.left;
        }
            TreeNode top = stack.peek();//查看顶部元素右树是否为空
            //两个条件,右树为null或者此元素右树已经出过栈则直接出栈
            if(top.right==null||prev==top.right){
             TreeNode cur = stack.pop();
                 list.add(cur.val);
                prev=top;//记录上一个栈顶元素
            }else{
                root=top.right;
            }
        }
        return list;
    }
相关推荐
xiangyun615 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun615 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan6 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技6 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
xxwxx__7 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Logic1017 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
xxwxx__11 小时前
C++ STL set 与 map 全套详解:关联式容器、红黑树底层、代码坑点、刷题实战
数据结构·c++
程曦曦11 小时前
MySQL 生产库误删 98 张表后的时间点恢复实战:从 binlog 解析到资金对账
linux·数据结构·其他·算法·ubuntu·运维开发
郝学胜-神的一滴11 小时前
Effective Python 条款 13:善用星号解包,告别下标切片拆分的坑
服务器·开发语言·数据结构·python·程序人生·pycharm
Logic10112 小时前
C语言/数据结构位运算题解:异或XOR找出流水线上的“独特零件编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质