首页 > 其他分享 >【二叉树的前中后序遍历】迭代法

【二叉树的前中后序遍历】迭代法

时间:2024-04-20 23:14:32浏览次数:13  
标签:node 遍历 vis right 二叉树 ans 迭代法 root

  • 三种遍历都是用维护二叉树前序遍历节点顺序

前序遍历

模拟前序遍历即可,记录顺序和入栈顺序一致

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root == null) return ans;

        Map<TreeNode, Boolean> vis = new HashMap<>();
        
        Stack<TreeNode> s = new Stack<>();
        s.push(root);
        ans.add(root.val);
        while(!s.empty()) {
            TreeNode node = s.peek();
            if(node.left != null && !vis.containsKey(node.left)) {
                s.push(node.left);
                ans.add(node.left.val);
            } else if(node.right != null && !vis.containsKey(node.right)) {
                s.push(node.right);
                ans.add(node.right.val);
            } else {
                vis.put(s.pop(), true);
            }
        }
        return ans;
    }
}

中序遍历

  1. 从根开始,遍历并入栈左儿子
  2. 若左儿子已被记录,先记录当前节点的value,再入栈右儿子
  3. 当左右儿子都已经被记录或遍历到叶子节点,且当前节点未被记录时,记录当前节点的value,弹栈回溯到其父亲,否则直接弹栈回溯到其父亲。
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root == null) return ans;

        Map<TreeNode, Boolean> vis = new HashMap<>();
        
        Stack<TreeNode> s = new Stack<>();
        s.push(root);

        while(!s.empty()) {
            TreeNode node = s.peek();

            if(node.left != null && !vis.containsKey(node.left)) {
                s.push(node.left);
            } else if(node.right != null && !vis.containsKey(node.right)) {
                ans.add(node.val);
                vis.put(node, true);
                s.push(node.right);
            } else if(!vis.containsKey(node)){
                ans.add(node.val);
                vis.put(s.pop(), true);
            } else {
                s.pop();
            }
        }

        return ans;

    }
}

后序遍历

  1. 从根开始,遍历并入栈左儿子
  2. 若左儿子已被记录,入栈右儿子;
  3. 当左右儿子都已经被记录或遍历到叶子节点,则记录当前节点的value,弹栈回溯到其父亲
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root == null) return ans;

        Map<TreeNode, Boolean> map = new HashMap<>();
        
        Stack<TreeNode> s = new Stack<>();
        s.push(root);

        while(!s.empty()) {
            TreeNode now = s.peek();
            if(now.left != null && !map.containsKey(now.left) ) {
                s.push(now.left);
            } else if(now.right != null && !map.containsKey(now.right) ){
                s.push(now.right);
            } else {
                ans.add(now.val);
                map.put(now, true);
                s.pop();
            }
        }
        return ans;
    }
}

标签:node,遍历,vis,right,二叉树,ans,迭代法,root
From: https://www.cnblogs.com/Eve7Xu/p/18148353

相关文章

  • JZ86 在二叉树中找到两个节点的最近公共祖先
    classSolution{public://用来判断是否找到节点boolflag=false;//dfs遍历得到路径,递归遍历,也就是先序遍历根左右//传入参数:节点,容器,要找的值voiddfs(TreeNode*root,vector<int>&path,into){//判断根节点的值是否是要找的......
  • 【根据前序和中序遍历构造二叉树】栈+迭代 || 递归
    105.从前序与中序遍历序列构造二叉树栈+迭代规律前序遍历中相邻节点u和v,v节点一定是u节点的左节点或者是其自身某个祖先的右节点一个没有右节点的链,中序遍历是从叶子到根,前序遍历是从根到叶子解题思路用一个栈维护前序遍历的节点用一个指针p指向中序遍历的第一个叶子节......
  • 给出二叉树的前序遍历和中序遍历--还原二叉树
    voidf(intidxroot){ //根据前序遍历和中序遍历还原二叉树if(idxroot==n+1)return;introot=pre[idxroot];boolcheck=true;map<int,int>lcmp,rcmp;//当前节点的左孩子集合和右孩子集合for(inti=1;i<=n;i++){if(vis[mid[i]]&&mid[i]!......
  • JZ32 从上往下打印二叉树
    /*structTreeNode{intval;structTreeNode*left;structTreeNode*right;TreeNode(intx):val(x),left(NULL),right(NULL){}};*/classSolution{public:vector<int>PrintFromTopToBottom(TreeNode*root){......
  • JZ33 二叉排序树的后序遍历序列
    classSolution{public://判断该数组是不是某二叉搜索树的后序遍历的结果。//如果是则返回true,否则返回false//注意传入参数是一个int类型的vector容器boolVerifySquenceOfBST(vector<int>sequence){if(sequence.empty()) //二叉树......
  • Effective Python:第8条 用zip函数同时遍历两个迭代器
    用Python内置的zip函数来实现。这个函数能把两个或更多的iterator封装成惰性生成器(lazygenerator)。每次循环时,它会分别从这些迭代器里获取各自的下一个元素,并把这些值放在一个元组里面。names=["Cecilia","Lise","Marie"]counts=[len(n)forninnames]max_count=......
  • 树3-二叉树非递归遍历(栈)
    树3-二叉树非递归遍历(栈)拷贝根结点,初始值FALSE,入栈弹出,如果是FALSE,将根节点将更新为TRUE,其子结点(初始值FALSE)一并入栈[A,B,C](前序遍历,入栈顺序:C,B,A输出顺序:A,B,C)再弹出,如果是TRUE则输出引入链式栈头文件#include"linkedStack.h"链式栈头文......
  • JZ36二叉树排序树与双向链表
    /*structTreeNode{ intval; structTreeNode*left; structTreeNode*right; TreeNode(intx): val(x),left(NULL),right(NULL){ }};*/#include<cstddef>classSolution{public: TreeNode*ans=nullptr; //最终的链表 TreeNode*pre=nullptr; ......
  • 树1-二叉树概念与遍历方法
    树1:二叉树概念与遍历方法二叉树二叉树的遍历二叉树遍历分为前序,中序,后序.序是指遍历根结点的顺序D-data,根L左R右,先序遍历ABCDE-FGH中序遍历BDCE-A-FHG后序遍历DECB-HGF-A先序遍历ABDH-I-EJCFG中序遍历HDI-B-JEAFCG后序遍历HID-J......
  • 树2-二叉树拷贝, 遍历, 计算叶子结点和高度
    树2-二叉树拷贝,遍历,计算叶子结点和高度二叉树结点typedefstructBinaryNode{charch;structBinaryNode*lChild;structBinaryNode*rChild;}BinaryNode;//叶子结点的数量intsum;二叉树遍历前序//递归遍历(前序)voidRecursion(BinaryNode*roo......