首页 > 其他分享 >二叉树遍历

二叉树遍历

时间:2024-12-08 17:29:19浏览次数:11  
标签:tmp 遍历 right 二叉树 null root stack left

前序

顺序为根左右

递归

public static void preLoop(TreeNode root) {
    System.out.println(root.value);
    if (root.left != null) {
        preLoop(root.left);
    }
    if (root.right != null) {
        preLoop(root.right);
    }
}

其他

使用栈,以根右左的顺序进栈,再打印出栈

public static void stackPreLoop(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    TreeNode tmp;
    while (!stack.isEmpty()) {
        tmp = stack.pop();
        System.out.println(tmp.value);
        // 根右左的顺序进栈
        if (tmp.right != null) {
            stack.push(tmp.right);
        }
        if (tmp.left != null) {
            stack.push(tmp.left);
        }
    }
}

中序

左根右

递归

public static void midLoop(TreeNode root) {
    if (root.left != null) {
        midLoop(root.left);
    }
    System.out.println(root.value);
    if (root.right != null) {
        midLoop(root.right);
    }
}

其他

思路就是,先把头结点的所有左边子树压入栈,弹出来的时候,再把右边子树压进去,

如果左右都没有再压入中间

弹出打印

public static void midLoop2(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    while (!stack.isEmpty() || root != null) {
        if (root != null) {
            // 所有左树压入
            stack.push(root);
            // root.left可以为空,下个循环就会剔除
            root = root.left;
        } else {
            // 当左树没了
            root = stack.pop();
            System.out.println(root.value);
            // 指向右节点
            root = root.right;
        }
    }
}

后序

左右根

递归

public static void behindLoop(TreeNode root) {
    if (root.left != null) {
        behindLoop(root.left);
    }
    if (root.right != null) {
        behindLoop(root.right);
    }
    System.out.println(root.value);
}

其他

使用栈存储,先压左再压右

再用一个辅助存储栈,然后出栈打印

public static void stackBehindLoop(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    Stack<TreeNode> helpStack = new Stack<>();
    stack.push(root);
    TreeNode tmp;
    while (!stack.isEmpty()) {
        tmp = stack.pop();
        helpStack.push(tmp);
        // 先压左再压右边
        if (tmp.left != null) {
            stack.push(tmp.left);
        }
        if (tmp.right != null) {
            stack.push(tmp.right);
        }
    }
    while (!helpStack.isEmpty()) {
        tmp = helpStack.pop();
        System.out.println(tmp.value);
    }
}

深度优先遍历

即前序遍历

求最小深度

设叶子节点的深度值为1,先递归到叶子节点,然后往上返回,当有left或者right的节点时,则深度值+1

public static int depth(TreeNode root) {
    if (root == null) {
        return 0;
    }
    if(root.left == null && root.right == null) {
        return 1;
    }
    if (root.left != null && root.right != null) {
        return Math.min(depth(root.left) + 1, depth(root.right) + 1);
    }
    if (root.left != null) {
        return depth(root.left) + 1;
    }
    if (root.right != null) {
        return depth(root.right) + 1;
    }
    return 0;
}

广度优先遍历

求最大宽度

广度优先求最大宽度需要一个辅助队列,把头节点放入队列,然后头节点出队,左节点入队,右节点入队,通过这样的形式可以顺序遍历整棵树。同时还需要一个哈希表,在入队的时候去存储每个节点对应的层数,这样在出队的时候可以结算同层的数目

public static int width(TreeNode root) {
    // 记录节点和层次的关系
    HashMap<TreeNode, Integer> levelMap = new HashMap<>();
    // 通过队列进行顺序遍历
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    levelMap.put(root, 1);
    int currentLevel = 1;
    int currentLevelCount = 0;
    int maxWidth = 0;
    while (!queue.isEmpty()) {
        root = queue.poll();
        if (levelMap.get(root) == currentLevel) {
            currentLevelCount ++;
        } else {
            currentLevel ++;
            // 到达下一层结算
            maxWidth = Math.max(maxWidth, currentLevelCount);
            currentLevelCount = 1;
        }
        if (root.left != null) {
            queue.offer(root.left);
            levelMap.put(root.left, currentLevel+1);
        }
        if (root.right != null) {
            queue.offer(root.right);
            levelMap.put(root.right, currentLevel+1);
        }
        // 这里需要在队列为空的时候求一下最大值,否则就不会记录了
        if (queue.isEmpty()) {
            maxWidth = Math.max(maxWidth, currentLevelCount);
        }
    }
    System.out.println(maxWidth);
    return maxWidth;
}

 

 

 

标签:tmp,遍历,right,二叉树,null,root,stack,left
From: https://blog.csdn.net/baidu_28505395/article/details/144319942

相关文章

  • 【Leetcode Top 100】94. 二叉树的中序遍历
    问题背景给定一个二叉树的根节点rootrootroot,返回它的中序遍历。数据约......
  • 199.二叉树的右视图
    /***@param{TreeNode}root*@return{number[]}*/varrightSideView=function(root){if(!root)return[];letdethMap=newMap();//Map夺储,key是当国节点的高度,value是我们当前节点的信;letqueue=[[root,0]];while(queue.length){//取出......
  • c语言实现二叉树的创建、遍历(先序、中序、后序)
    二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树在计算机科学中具有广泛的应用,如表达式解析、数据存储与检索等。以下是有关二叉树的基本知识。1.二叉树的基本定义节点:二叉树的基本组成单元,包括节点值和指向其子节点的指针(左指......
  • 根据后序遍历完全二叉树构建树并输出中序遍历
    来看这道题:之前编者想了很久,该如何仅根据后序序列建树,在反复研磨遍历的特征后,我突然发现:对于完全二叉树,我们完全可以采用其在线性表示(用数组)的性质解题性质:根节点x, 左子树索引为2x,右子树索引为2x+1且不为空。则,我们只需按后序遍历的特点递归建树即可。上代码:......
  • 写一个方法遍历指定对象的所有属性
    functionenumerateProperties(obj){constproperties=[];for(constkeyinobj){if(obj.hasOwnProperty(key)){//过滤掉继承的属性properties.push({name:key,value:obj[key]});}}returnproperties;}//......
  • 数据结构5——二叉树
    走上计算机的道路,疲惫和无力会不断向你袭来。虽途艰路险,然功成之日,往昔困厄皆为序章,亦足慰心怀,堪称圆满。目录1.树概念及结构1.1树的概念1.2树的相关概念1.3树的表示1.4树在实际中的运用(表示文件系统的目录树结构)2.二叉树概念及结构2.1概念2.2现实中的二叉树2.3特......
  • 洛谷P1305 新二叉树(c嘎嘎)
    题目链接:P1305新二叉树-洛谷|计算机科学教育新生态题目难度:普及刷题心得:做了几道这种类型的题都不用建树就可以解决,基本上还是利用好树的结构,例如这道题求前序序列(根左右)是可以用递归来求的。无非就是先从根出发,递归遍历左子树,递归遍历右子树,遇到 *直接返回就行了......
  • powershell遍历注册dll
    #设置要遍历的根文件夹路径,你可以根据实际情况修改这个路径$rootFolder="C:\script\dlls"#获取该文件夹及其子文件夹下所有的.dll文件$dllFiles=Get-ChildItem-Path$rootFolder-Filter"*.dll"-Recurse#遍历每个找到的.dll文件并尝试注册foreach($dllFilein$dllFi......
  • 数据结构——图(遍历,最小生成树,最短路径)
    目录一.图的基本概念二.图的存储结构1.邻接矩阵2.邻接表三.图的遍历1.图的广度优先遍历2.图的深度优先遍历四.最小生成树1.Kruskal算法2.Prim算法五.最短路径1.单源最短路径--Dijkstra算法2.单源最短路径--Bellman-Ford算法3.多源最短路径--Floyd-Warshall算法......
  • 二叉树遍历
    [Algo]二叉树遍历二叉树节点类型定义:structBinaryTreeNode{intval;BinaryTreeNode*left;BinaryTreeNode*right;BinaryTreeNode(intx):val(x),left(nullptr),right(nullptr){}};1.前序遍历//1.非递归前序遍历二叉树//(1)弹出栈顶(2)......