首页 > 其他分享 >二叉树结构与递归实现前中后序遍历

二叉树结构与递归实现前中后序遍历

时间:2024-01-17 19:00:14浏览次数:20  
标签:遍历 TreeNode 前中 right 二叉树 new root public

1. 二叉树结构

2. 二叉树节点遍历顺序

前序:

每颗子树以 中 —》左 —》右 遍历

A B D E H C F G

 

中序:

每颗子树以  —》中 —》右 遍历

D B E H A F C G

 

后序:

每颗子树以  —》右 —》中 遍历

D H E B F G C A

 

代码实现:

public class BinaryTree {

    static class TreeNode {
        public TreeNode left;
        public char val;
        public TreeNode right;

        public TreeNode(char val) {
            this.val = val;
        }
    }

    public TreeNode createTree() {
        TreeNode A = new TreeNode('A');
        TreeNode B = new TreeNode('B');
        TreeNode C = new TreeNode('C');
        TreeNode D = new TreeNode('D');
        TreeNode E = new TreeNode('E');
        TreeNode F = new TreeNode('F');
        TreeNode G = new TreeNode('G');
        TreeNode H = new TreeNode('H');

        A.left = B;
        B.left = D;
        B.right = E;
        E.right = H;
        A.right = C;
        C.left = F;
        C.right = G;
        return A;
    }

    // 前序 - 根左右
    public void preOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.val + " ");
        preOrder(root.left);
        preOrder(root.right);
    }

    // 中序
    public void inOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        inOrder(root.left);
        System.out.print(root.val + " ");
        inOrder(root.right);
    }

    // 后序
    public void postOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val + " ");
    }

    public static void main(String[] args) {

        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = binaryTree.createTree();

        binaryTree.preOrder(root);
        System.out.println();

        binaryTree.inOrder(root);
        System.out.println();

        binaryTree.postOrder(root);

    }

}

 

3. 递归序理解二叉树遍历

除了空节点外 每一个节点一定会到达3次

第一次到达访问节点: 前序,第二次到达访问节点: 中序,第三次到达访问节点: 后序

访问节点的时机不同 遍历顺序也就不同

以递归序为例:

 

标签:遍历,TreeNode,前中,right,二叉树,new,root,public
From: https://www.cnblogs.com/xumu7/p/17969802

相关文章

  • 数组遍历的方法
    1、forEach()forEach() 方法对数组的每个元素执行一次给定的函数,不会改变原数组,没有返回值。数组中的每个值都会调用回调函数,回调函数有三个参数:currentValue:必需。当前元素。index:可选。当前元素的索引值。arr:可选。当前元素所属的数组对象。//forEach不会改......
  • 二叉树的公共祖先
    最开始做的时候,就先想到的是找父节点的那个函数,于是先把目标节点的所以祖先节点存起来,然后一个一个进行比对,当然这样耗时很大。点击查看代码classSolution{public:vector<TreeNode*>vp,vq;TreeNode*findfa(TreeNode*root,TreeNode*k){if(!root){returnNULL;}if(ro......
  • 遍历链表,将节点接到末端 【1月16日学习笔记】
    点击查看代码//遍历链表,将节点接到末端#include<iostream>usingnamespacestd;structnode{ intdata;//数据 node*next;//尾巴};//定义节点结构体node*A;//头指针固定,globalvariabl......
  • 代码随想录 day21 二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先
    二叉搜索树的最小绝对差二叉搜索树就是有序数组那么转换一下就很简单了也可以直接在遍历二叉搜索树的时候进行比较需要一个指针记录前一个节点二叉搜索树中的众数既可以把这题的二叉搜索树当成一般树来做这样就是层序遍历树然后用map记录频率再取频率最高的值这里用......
  • 关于二叉树递归代码的粗鄙理解
    整体来看,二叉树的递归代码,可以分为终止条件,单层递归逻辑。单层递归逻辑就是所谓的根左右那三种,选哪一种也是有讲究的,如果不需要对根节点进行处理,那三种都可以。如果题目侧重与由子节点推到父节点,就采用后序遍历。如果题目侧重与由父节点推到子节点,就采用前序遍历。终止条件怎......
  • 性能篇:List集合遍历元素用哪种方式更快?
    嗨大家好,我是小米!今天给大家分享一篇关于Java集合框架性能的文章,话题是:“如果让你使用for循环以及迭代循环遍历一个ArrayList,你会使用哪种方式呢?原因是什么?LinkedList呢?”废话不多说,让我们直入主题!ArrayList的get元素源码介绍ArrayList,作为Java集合框架中的一个重要类,是基于数组......
  • P1443 马的遍历
    马的遍历题目描述有一个\(n\timesm\)的棋盘,在某个点\((x,y)\)上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。输入格式输入只有一行四个整数,分别为\(n,m,x,y\)。输出格式一个\(n\timesm\)的矩阵,代表马到达某个点最少要走几步(不能到达则输出\(-......
  • 代码随想录 day20 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
    最大二叉树前序遍历递归效率不高因为每次都要新开数组给左右子树可以在同一个数组上做这个事情合并二叉树一开始不知道怎么同时遍历两棵树其实只要同时传入两棵树的节点就可以了这里判断两棵树谁空就另外一个作为构造树全为空那就会构造空节点二叉搜索树中的搜索......
  • 非递归形式遍历二叉树
    最简单的就是前序遍历,每次将栈顶元素插入数组中。但要注意由于栈的性质,先push右节点再push左节点。点击查看代码classSolution{public:vector<int>preorderTraversal(TreeNode*root){vector<int>v;stack<TreeNode*>stk;if(root!=NULL){stk.push(root);}while(!......
  • 一套模板搞定二叉树算法题--二叉树算法讲解002
    1、二叉树的递归递归:2、二叉树遍历之DFS深度优先遍历2.1、遍历的概念每个节点都要恰好被访问一次,本质上是二叉树的线性化。一个树形的结构,线性化为一个数组之类的"串"的结构。2.2、DFS深度优先遍历示例二叉树原型图:2.2.1、前序遍历前序遍历执行顺序:根节点--对左子......