首页 > 其他分享 >二叉树前中后序遍历 迭代法 只需一招!

二叉树前中后序遍历 迭代法 只需一招!

时间:2024-04-30 16:25:23浏览次数:22  
标签:cur 前中 res 节点 addFirst 迭代法 first stack 二叉树

核心思想

以中序遍历为例

在迭代法中 我们拿到 1 节点 由于有左孩子 我们就会推入 2 节点,2 节点又有左孩子, 所以我们推入 4, 然后弹出 2 节点, 由于这是第二次访问 2 节点, 也就意味着左子树已经去过了, 所以推入 5 节点。

那么我们模拟一下 栈的变化
假设左边为栈顶。

1 -> 21 -> 421-> 21 -> 521 -> 21 -> 1 -> 31 -> 1

所以 每当一个节点我们访问到第二次的时候就是输出节点值的时候
那么我们可以每次入栈的时候 标记下节点的访问次数:
"first" -> 第一次
"second" -> 第二次

对于第一次访问的节点 我们依次推入他的 右中左 节点 这样从栈顶往下看 就是 左中右的顺序,也就是中序的顺序。
对于第二次访问的节点 我们记录他的节点值就好

来模拟一下 左边依然是栈顶

1 -> 213 -> 42513 -> 2513 -> 213 -> 13 -> 3

代码

中序遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        LinkedList<Object> stack = new LinkedList<>();
        stack.addFirst(root);
        stack.addFirst("first");
        while(!stack.isEmpty()){
            String cnt = (String) stack.pollFirst();
            TreeNode cur = (TreeNode) stack.pollFirst();
            if(cur == null)
                continue;
            if(cnt.equals("first")){
                stack.addFirst(cur.right);
                stack.addFirst("first");

                stack.addFirst(cur);
                stack.addFirst("second");

                stack.addFirst(cur.left);
                stack.addFirst("first");

            }else{
                res.add(cur.val);
            }
        }
        return res;
    }
}

前序遍历

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        LinkedList<Object> stack = new LinkedList<>();
        stack.addFirst(root);
        stack.addFirst("first");
        while(!stack.isEmpty()){
            String p = (String) stack.pollFirst();
            TreeNode cur = (TreeNode) stack.pollFirst();
            if(cur == null)
                continue;
            if(p.equals("first")){
                stack.addFirst(cur.right);
                stack.addFirst("first");

                stack.addFirst(cur.left);
                stack.addFirst("first");

                stack.addFirst(cur);
                stack.addFirst("second");

            }else{
                res.add(cur.val);
            }
        }
        return res;
    }
}

后序遍历

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        LinkedList<Object> stack = new LinkedList<>();
        stack.addFirst(root);
        stack.addFirst("first");
        while(!stack.isEmpty()){
            String cnt = (String) stack.pollFirst();
            TreeNode cur = (TreeNode) stack.pollFirst();
            if(cur == null)
                continue;
            if(cnt.equals("first")){
                stack.addFirst(cur);
                stack.addFirst("second");

                stack.addFirst(cur.right);
                stack.addFirst("first");
                
                stack.addFirst(cur.left);
                stack.addFirst("first");

            }else{
                res.add(cur.val);
            }
        }
        return res;
    }
}

标签:cur,前中,res,节点,addFirst,迭代法,first,stack,二叉树
From: https://www.cnblogs.com/ganyq/p/18168182

相关文章

  • 【每日一题】感染二叉树需要的总时间
    2385.感染二叉树需要的总时间给你一棵二叉树的根节点root,二叉树中节点的值互不相同。另给你一个整数start。在第0分钟,感染将会从值为start的节点开始爆发。每分钟,如果节点满足以下全部条件,就会被感染:节点此前还没有感染。节点与一个已感染节点相邻。返回感染......
  • 二叉树笔试题解题思路
    数据结构二叉树笔试题:解题思路:1.判断是否为空树,若为空树,则返回0;2.定义两个指针备份根结点地址,定义两个整型变量a,b并初始化为0,记录左右子树的深度;先对根结点的左子树进行遍历,若根结点的左结点不为NULL,则a++,把根结点的左结点赋值为新的根结点,再进行上述操作,若根结点的左结点......
  • 数据结构-二叉树的初始化
    数据结构-二叉树的相关初始化/*************************************************/***@filename: DcirLLinkInsert*@brief对双向循环链表插入的功能实现*@[email protected]*@date2024/04/29*@version1.0:在下坂本,有何贵干*@property:none......
  • 已知二叉树的先序和后序求任意一中序
    假设一个二叉树上所有结点的权值都互不相同。我们可以通过后序遍历和中序遍历来确定唯一二叉树。也可以通过前序遍历和中序遍历来确定唯一二叉树。但是,如果只通过前序遍历和后序遍历,则有可能无法确定唯一二叉树。现在,给定一组前序遍历和后序遍历,请你输出对应二叉树的中序遍历......
  • 已知二叉树的前序和中序遍历求后序遍历
    假设二叉树上各结点的权值互不相同且都为正整数。给定二叉树的前序遍历和中序遍历,请你输出二叉树的后序遍历序列。输入格式第一行包含整数N,表示二叉树结点总数。第二行给出二叉树的前序遍历序列。第三行给出二叉树的中序遍历序列。输出格式输出二叉树的后序遍历的第一个数......
  • 已知二叉树的后序和中序遍历求前序遍历
    假设二叉树上各结点的权值互不相同且都为正整数。给定二叉树的后序遍历和中序遍历,请你输出二叉树的前序遍历的最后一个数字。输入格式:第一行包含整数N,表示二叉树结点总数。第二行给出二叉树的后序遍历序列。第三行给出二叉树的中序遍历序列。输出格式输出二叉树的前序遍......
  • 二叉树深度的题目
    #这是一道关于二叉树深度的题目。题目要求我们输入一个二叉树的结点数和每个结点的左右子结点编号,然后输出这棵二叉树的最大深度。#对于这个问题,我们可以使用递归的方法来求解。以下是一个Python的代码示例: depth=1defdfs(node,depth):ifnode==0:retu......
  • JZ8 二叉树的下一个结点
    #include<cstddef>classSolution{public:vector<TreeLinkNode*>nodes;//用户得到的输入只有一个子树根节点TreeLinkNode*GetNext(TreeLinkNode*pNode){TreeLinkNode*root=pNode;//获取根节点 //顺着next指针一直......
  • JZ79 判断是不是平衡二叉树
    classSolution{public://求深度intdeep(TreeNode*root){if(root==NULL)return0;//求左右子树的深度intleft=deep(root->left);intright=deep(root->right);return......
  • 【二叉树的前中后序遍历】迭代法
    三种遍历都是用栈维护二叉树前序遍历节点顺序前序遍历模拟前序遍历即可,记录顺序和入栈顺序一致classSolution{publicList<Integer>preorderTraversal(TreeNoderoot){List<Integer>ans=newArrayList<>();if(root==null)returnans;......