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

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

时间:2022-09-28 00:23:41浏览次数:48  
标签: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 result;}
    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最开头插入元素
    
    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/16736532.html

相关文章

  • leetcode 617. Merge Two Binary Trees 合并二叉树(简单)
    一、题目大意给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉......
  • 二叉树遍历
    前序遍历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语句的篡改,从而对数据库进行操作。比如在一个登录界面,要求输入用户名和密码,可以这样输入实现免帐号登录;用户名......
  • 二叉树的遍历方式(创建,遍历,执行)
    //binarytree.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>usingnamespacestd;typedefstructNODE{charch;N......
  • 线索化二叉树
    将数列{1,3,6,8,10,14}构建成一颗二叉树问题分析当我们对上面的二叉树进行中序遍历时,数列为{8,3,10,1,6,14}但是6,8,10,14这几个节点的左右......
  • 顺序存储二叉树
    简介从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组特点顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为......
  • 二叉树的最大深度
    二叉树的最大深度一、题目描述给定一个二叉树,找出其最大深度。二叉树的最大深度为根节点到最远叶子节点的最长路径上的节点数。叶子节点时没有字节点的。实例:给定二叉......
  • 平衡二叉树(AVL)的插入和删除
    在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是......
  • LeetCode2096 从二叉树一个节点到另一个节点每一步的方向
    LeetCode2096从二叉树一个节点到另一个节点每一步的方向最近公共祖先的变形题.#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val......
  • 二叉树遍历
    应用实例代码实现publicclassBinaryTreeDemo{ publicstaticvoidmain(String[]args){ //先需要创建一颗二叉树 BinaryTreebinaryTree=newBinary......