首页 > 其他分享 >二叉树的前中后序遍历的两种方法

二叉树的前中后序遍历的两种方法

时间:2022-09-28 08:23:08浏览次数:61  
标签:node 遍历 后序 List list 二叉树 root stack

前中后序遍历的记忆方式:前中后可以记为中间节点的顺序位置,如:前序遍历:中左右;中序遍历:左中右;后续遍历:左右中。

//前序遍历:
算法实现:前序遍历顺序为中左右。需要传入root根节点,一个List进行接收遍历后的有序节点。终止条件是当root == null 说明到了叶子节点,结束递归。每次递归的逻辑:中左右,将val放入List中,先遍历左孩子再遍历右孩子。

//代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
     List<Integer> list =  new ArrayList<Integer>();
    preTree(root,list);
    return list;

    }

    public void preTree(TreeNode root,List<Integer>  list) {
        if(root == null){
            return;
        }
        list.add(root.val);
        preTree(root.left,list);
        preTree(root.right,list);
    } 
}

//中序 左中右
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
  List<Integer> list =  new ArrayList<Integer>();
    midTree(root,list);
    return list;
    }

    public void midTree(TreeNode root,List<Integer>  list) {
        if(root == null){
            return;
        }
        midTree(root.left,list);
        list.add(root.val);
        midTree(root.right,list);
    } 
}

//后序 左右中
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();
    postTree(root,list);
    return list;
    }

    public void postTree(TreeNode root,List<Integer> list){
        if(root == null) {
            return;
        }

        postTree(root.left,list);
        postTree(root.right,list);
        list.add(root.val);

    }
}
//迭代法 栈模拟
// 前序遍历顺序:中-左-右,入栈顺序:中-右-左
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        if(root == null){
            return list;
        }
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            list.add(node.val);
            if(node.right != null){
                stack.push(node.right);    
            } 
            if(node.left != null) {
                stack.push(node.left);
            }
        }
        return list;

    }
}
//中序遍历 迭代法访问和处理是两个过程,先把左子树处理完之后,弹出左子树最后一个叶子节点,进行处理。如果有右子树则对其在进行遍历,如果没有则弹出上一节点,再次进行处理。
//访问和处理是两个过程,先访问中间节点但是不处理
class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); if (root == null) {return list;} Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode node = root; while(node != null || !stack.isEmpty()) { if (node != null) { stack.push(node); node = node.left; }else { node = stack.pop(); list.add(node.val); node = node.right; } } return list; } } // 后序遍历顺序:左-右-中,入栈顺序: public class PostorderTraversal { private List<Integer> result = new ArrayList<Integer>(); /** * 迭代实现,使用栈实现,出栈得到节点顺序为根右左,每次向list最开头插入元素 * @param root * @return */ public List<Integer> postorderTraversal(TreeNode root) { if(root == null) return result; Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(root); //首先将根节点压栈 while(!stack.isEmpty()) { TreeNode node = stack.pop(); //首先出栈的为根节点,其后先出右子节点,后出左子节点 if(node.left != null) stack.push(node.left); //将左子节点压栈 if(node.right != null) { stack.push(node.right); //将右子节点压栈 } result.add(0, node.val); //因为出栈顺序为“根右左”,所以需要每次将元素插入list开头 } return result; } }

 

标签:node,遍历,后序,List,list,二叉树,root,stack
From: https://www.cnblogs.com/noedaydayup/p/16736691.html

相关文章

  • 二叉树前中后序遍历的两种方式
    前中后序遍历的记忆方式:前中后可以记为中间节点的顺序位置,如:前序遍历:中左右;中序遍历:左中右;后续遍历:左右中。//前序遍历:算法实现:前序遍历顺序为中左右。需要传......
  • 数据结构学习----树的遍历
    树的遍历前言在一个平常的星期二下午,一节数据结构课中,想着做点什么的我,打开了力扣。正好老师在讲树,我也从二叉树最基础的遍历开始刷题,没想到打开了新世界的大门····......
  • leetcode 617. Merge Two Binary Trees 合并二叉树(简单)
    一、题目大意给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉......
  • Oracle游标遍历所有用户表
    DECLARE tablenamevarchar(500); vsqlvarchar(500); vcountint; vcount1int; cursoremp_cursorisselecttable_namefromuser_tables;BEGIN vcount:=1......
  • jQuery中有哪些方法可以遍历节点
    children():获取匹配元素的子元素集合,不考虑后代元素$(function(){$("div").children()})next()获取匹配元素后面紧邻的同级元素prev()获取匹配元素前紧邻的同级元素si......
  • 二叉树遍历
    前序遍历A->C->D->E->F->H->G->Bvoidtraversal(Node*node){if(!node->left&&node->right){res.push_back(node);return;)if(node->left)traversal(nod......
  • 今日部分知识点总结———SQL注入,hooks的优缺点,cookies,xxxStorage的区别,BFC,合并二叉
    SQL注入在浏览器页面用户提交数据处,输入特定的字符实现sql语句的篡改,从而对数据库进行操作。比如在一个登录界面,要求输入用户名和密码,可以这样输入实现免帐号登录;用户名......
  • 使用Stream流的方式.遍历集合.对集合中的数据进行过滤
    Stream的更优写法/***使用Stream流的方式,遍历集合,对集合中的数据进行过滤*Stream流是JDK1.8之后出现的*关注的是做什么,而不是怎么做*/publiccl......
  • 使用传统的方式,遍历集合,对集合中的数据进行过滤
    Java8的Lambda让我们可以更加专注于做什么(What),而不是怎么做(How),这点此前已经结合内部类进行了对比说明。现在,我们仔细体会一下上例代码,可以发现:=for循环的语法就是“怎么......
  • 基于BS4的遍历方法及BS4库的HTML格式化和编码
    一、基于BS4的遍历方法1.html基本格式2.便签树的遍历方法(1)标签树的下行遍历属性说明.contents子节点的列表,将所有儿子节点存入列表.children子节点的迭代类......