【详细】二叉树的基本操作

二叉树的创建和基本操作(详解) 本文主要讲解递归实现二叉树的代码,对于树,二叉树的性质概念不多赘述我们以'#'代表空结点(为已有结点下的左右空孩子),方便创建二叉树,我们以下图的二叉树作为讲解。 阅读详情

基本操作

  1. 前序遍历(递归)
private void preOrder(TNode root){
        if(root != null){
            System.out.print(root.val+" ");
            preOrder(root.left);
            preOrder(root.right);
        }
    }
  1. 中序遍历(递归)
  private void infixOrder(TNode root){
        if(root != null){
            infixOrder(root.left);
            System.out.print(root.val+" ");
            infixOrder(root.right);
        }
    }

  1. 后序遍历(递归)
private void postOrder(TNode root){
        if(root != null){
            postOrder(root.left);
            postOrder(root.right);
            System.out.print(root.val+" ");
        }
    }
  1. 求节点个数
private int getNodeCount(TNode root){
        if(root != null){
            return 1+getNodeCount(root.left)+getNodeCount(root.right);
        }
        return 0;
    }

  1. 求叶子节点个数
private int getLeafCount(TNode root){
        if (root == null){
            return 0;
        }
        if(root.right == null && root.left == null){
            return 1;
        }
        return getLeafCount(root.left)+getLeafCount(root.right);
    }

  1. 求树高
private int getTreeHeight(TNode root){
        if(root == null){
            return 0;
        }

        return 1+Math.max(getTreeHeight(root.right),getTreeHeight(root.left));
}

  1. 求第K层上节点数
private int getKCount(TNode root,int k){
        if(root == null || k < 1){
            return 0;
        }
        if(k == 1){
            return 1;
        }

        return getKCount(root.left,k-1)+getKCount(root.right,k-1);
    }

  1. 查找 val 所在结点,没有找到返回 null,按照 根 -> 左子树 -> 右子树的顺序进行查找,一旦找到,立即返回,不需要继续在其他位置查找
private TNode find(TNode root,int val){
        if(root != null){
            if(root.val == val){
                return root;
            }
            TNode node = find(root.left,val);
            if(node != null){
                return node;
            }
            return find(root.right,val);
        }
        return null;
    }

代码整合:

----创建树的方法仅仅为了测试不推荐使用
public class BTree {
    TNode root = null;

	//初始化创建树
    public BTree() {
        root = new TNode(1);
        TNode node2 = new TNode(2);
        TNode node3 = new TNode(3);
        TNode node4 = new TNode(4);
        TNode node5 = new TNode(5);
        TNode node6 = new TNode(6);
        root.left = node2;
        root.right = node3;
        node2.left = node4;
        node2.right = node5;
        node4.left = node6;
    }

    //前序遍历
    public void preOrder(){
        System.out.println("前序遍历:");
        preOrder(root);
        System.out.println();
    }
    private void preOrder(TNode root){
        if(root != null){
            System.out.print(root.val+" ");
            preOrder(root.left);
            preOrder(root.right);
        }
    }

    //中序遍历
    public void infixOrder(){
        System.out.println("中序遍历:");
        infixOrder(root);
        System.out.println();
    }
    private void infixOrder(TNode root){
        if(root != null){
            infixOrder(root.left);
            System.out.print(root.val+" ");
            infixOrder(root.right);
        }
    }

    //后序遍历
    public void postOrder(){
        System.out.println("后序遍历:");
        postOrder(root);
        System.out.println();
    }
    private void postOrder(TNode root){
        if(root != null){
            postOrder(root.left);
            postOrder(root.right);
            System.out.print(root.val+" ");
        }
    }

    //返回总共多少节点
    public int getNodeCount(){
        return getNodeCount(root);
    }
    private int getNodeCount(TNode root){
        if(root != null){
            return 1+getNodeCount(root.left)+getNodeCount(root.right);
        }
        return 0;
    }

    //返回多少个叶子节点
    public int getLeafCount(){
        return getLeafCount(root);
    }
    private int getLeafCount(TNode root){
        if (root == null){
            return 0;
        }
        if(root.right == null && root.left == null){
            return 1;
        }
        return getLeafCount(root.left)+getLeafCount(root.right);
    }

    //返回树高
    public int getTreeHeight(){
        return getTreeHeight(root);
    }
    private int getTreeHeight(TNode root){
        if(root == null){
            return 0;
        }

        return 1+Math.max(getTreeHeight(root.right),getTreeHeight(root.left));
    }

    //求第k层的节点数
    public int getKCount(int k){
        return getKCount(root,k);
    }
    private int getKCount(TNode root,int k){
        if(root == null || k < 1){
            return 0;
        }
        if(k == 1){
            return 1;
        }

        return getKCount(root.left,k-1)+getKCount(root.right,k-1);
    }

    // 查找 val 所在结点,没有找到返回 null
    // 按照 根 -> 左子树 -> 右子树的顺序进行查找
    // 一旦找到,立即返回,不需要继续在其他位置查找
    public TNode find(int val){
        return find(root,val);
    }
    private TNode find(TNode root,int val){
        if(root != null){
            if(root.val == val){
                return root;
            }
            TNode node = find(root.left,val);
            if(node != null){
                return node;
            }
            return find(root.right,val);
        }
        return null;
    }

    public static void main(String[] args) {
        BTree bTree = new BTree();
//        bTree.preOrder();
//        bTree.infixOrder();
//        bTree.postOrder();
//        System.out.println("一共"+bTree.getNodeCount()+"个节点");
//        System.out.println("一共"+bTree.getLeafCount()+"个叶子节点");
//        System.out.println("树高:"+bTree.getTreeHeight());
        System.out.println(bTree.getKCount(3));
        System.out.println(bTree.find(1));
    }
}

//二叉树节点
class TNode{
    public int val;
    public TNode left;
    public TNode right;

    public TNode(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "TNode{" +
                "val=" + val +
                '}';
    }
}
树莓派入门教程 - 0 - 准备篇 - 0.0 SD卡制作树莓派系统镜像启动盘 开机 电脑需要提前安装的工具: sd卡格式化工具SDFormatter,官网下载链接:https://www.sdcard.org/downloads/formatter/ 镜像烧录工具Win32 Disk Imager,官网下载链接:https://win32diskimager.download/ 使用到的硬件: 一张容量大于等于16GB的TF卡 + 读卡器; 树莓派板卡。3B、3B+、4B等各型号均可,带有 HDMI接口即可。 HDMI接口的显示屏。 鼠标、键盘、电脑。 1.... 阅读详情

相关推荐

告别手动群发!用IDA Pro和CE搞定企业微信4.1.38.6011的HOOK开发(附完整代码)

本文详细介绍了如何利用IDA Pro和Cheat Engine进行企业微信4.1.38.6011的HOOK开发,实现自动化群发功能。从逆向工程环境配置、关键函数定位到HOOK框架设计,提供完整代码示例,帮助企业提升运营效率。

weixin_42533120的博客 478

二叉树-查找指定节点

二叉树查找指定节点思路 前序查找思路 当前节点是否为空,不为空判断当前节点的rank是否等于要查找的rank 若等于,则返回当前节点; 若不等于,则判断当前节点的左子节点是否为空, 如果不为空,则继续向左递归前序查找,如果左递归前序查找, 找到了节点,则返回; 若没找到,则继续判断当前节点的右子节点是否为空, 如果不为空,则继续向右递归前序查找,如果右递归前序查找,找到了节点,则返回。若没找到则为空。 /** * 树的节点 */ class TreeNode{ public int rank

Rong_zhe的博客 4885

如何导入su_利用GIS快速生成SU场地模型

01|前言:进入2021年了,希望大家也是一个新的开始。告诫自己多写文章多更新,多读点书多旅行。然而元旦由于出去玩了4天,积累了一些事情要处理,一直没有时间好好写点东西。今天给大家带来的分享主题叫“利用GIS快速生成SU场地模型”。相关的视频方法其实B站上也有,但我相信视频很多人都不会看,我自己也是。直接给大家上操作流程。主要的操作步骤是【获取场地的矢量shp文件】—【导入ArcScen...

weixin_33806859的博客 9813

二叉树相关算法

二叉树类算法 一、二叉树的路径和:二叉树的每个节点为0-9的一个数字,根到叶子的一条路径拼成一个数,求所有路径形成的数字和 struct TreeNode { TreeNode* left; TreeNode* right; int value; }; int dfs(TreeNode* root, int sum) { if (root == nullptr) { return 0; } if (root->left ==

much efforts, much luck 1452

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南

本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。

weixin_42549451的博客 203

Cadence Virtuoso实战:NMOS差分放大器设计与SPICE仿真全解析

本文详细解析了使用Cadence Virtuoso设计NMOS差分放大器并进行SPICE仿真的全流程。从基础设计要点、原理图绘制到工作点分析与性能调优,提供了实用的设计技巧和常见问题解决方案,帮助工程师高效完成模拟集成电路设计。重点介绍了差分放大器的关键参数设置、饱和区优化及版图设计注意事项,适用于ADC、DAC等高性能电路开发。

weixin_28340315的博客 610

二叉树的构建

二叉树是一种非常重要的数据结构。本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历、中序遍历、后序遍历、层次遍历),二叉搜索树的构造等。

li123128的博客 3648

WorkBuddy CAD 审图救命课:约束、单位、尺寸链一次查清,打样前拦住返工

最危险的 CAD 文件不是打不开,而是看起来完整却混用了毫米与英寸、草图欠约束、关键尺寸没有来源。审图任务必须先列规则,再输出问题位置。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、FreeCAD 0.21.2、OpenCascade 7.7 与人工审阅组成一条可复现链路。你会从“一份模拟 STEP 文件、参数表、装配基准与审图标准”出发,得到“单位报告、约束清单、尺寸链风险表与人工复核标记”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶段。

yueyeguzhuo的专栏 264

二叉树基本操作

二叉树的先序,中序,后序遍历的递归与非递归,二叉排序树的建立,添加,删除,满二叉树,完全二叉树的判断

青耕_的博客 1901

3、提升管壳式换热器能效:双螺旋盘管的应用研究

本研究探讨了在管壳式热交换器中应用双螺旋盘管以提升能效的可行性。通过实验对比双螺旋与单螺旋盘管的热传递效率,结果显示双螺旋盘管达到54.33%的效率,显著优于单螺旋的48.88%。双螺旋结构不仅增大了换热面积,还因产生剪切应力而减少结垢,延长运行周期。采用NTU方法评估热传递性能,验证了该设计在工业应用中的高效性与实用性,建议在制冷、空调、石油精炼等领域推广使用。

k8s6orchestrator的博客 107

枚举 ACS 电机状态位 完全解析

本文解析了ACS运动控制器SDK中的MotorStates枚举,该枚举对应控制器状态标志位?MFLAGS。主要介绍了6个核心状态:ACSC_ALL(-1)表示所有轴,ACSC_NONE(0)为空闲状态,ACSC_MST_ENABLE(1)为轴使能,ACSC_MST_INPOS(16)表示到位,ACSC_MST_MOVE(32)为运动中,ACSC_MST_ACC(64)为加速中。文章还补充了完整的枚举定义,包含报警、回零等状态,并提供了在晶圆AOI4轴运动中的典型应用场景,如判断轴状态、运动条件等。最后强调只

StevenChen的博客 246

二叉树的基本操作

从根开始定义起,根为第1层,根的子节点为第2层,以此类推。:若一个节点含有子节点,则这个节点称为其子节点的父节点。:以某节点为根的子树中任一节点都称为该节点的子孙。:一个节点含有的子树的根节点称为该节点的子节点。:一个节点含有的子树的个数称为该节点的度。:具有相同父节点的节点互称为兄弟节点。:一棵树中,最大的节点的度称为树的度。:从根到该节点所经分支上的所有节点。:双亲在同一层的节点互为堂兄弟。:度为0的节点称为叶节点。非终端节点或分支节点。:树中节点的最大层次。

m0_63783532的博客 2044

【零基础入门unity游戏开发——unity通用篇14】unity特性相关的知识(基于unity6开发介绍)

unity特性相关的知识(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1203

详细解读二叉树基本操作

二叉树的详细解读 二叉树的概念 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成 二叉树的特点:每个结点最多有两棵子树,即二叉树不存在度大于2的结点 二叉树的子树有左右之分,其子树的次序不能颠倒 因此:二叉树是通过上述5中形式的组合或嵌套而形成 满二叉树&amp;amp;完全二叉树 满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和...

一条二哈 751

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java【二叉树】详细图解 + 掌握重点基本操作

关于二叉树的相关知识和相关操作代码整理分享~

yzhcjl_的博客 1834

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++ 实现二叉树的一些基本操作(详细注释版)【原创】

中序,前序(后序同理)遍历恢复二叉树思路: 1.前序遍历的第一个元素为根节点。 2.在中序遍历中,找到确定的根节点,可以把中序遍历分割成左右子树的中序遍历 3.在前序遍历中,区分中序遍历的左右子树部分,根据前序遍历的特点1,找到左右子树的根节点。 4.依次类推,直到左右子树为空为止。 代码如下: 因为代码中有详细注释,在此不在赘述。 头文件:tree.h #pragma once #ifndef _TREE_H_ #define _TREE_H_ #include<iostream> #incl

syao_zj的博客 937

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

二叉树的建立与基本操作(超详细)

【代码】二叉树的建立与基本操作(超详细)

m0_67764098的博客 693

二叉搜索(查找)树的查找/插入/删除以及二叉树搜索树的建立等基本操作的详细介绍

二叉搜索树(BST,Binary Search Tree), 也称二叉排序树或二叉查找树 定义 二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质: 非空左子树的所有结点的值小于其根结点的值。 非空右子树的所有结点的值大于其根结点的值。 左、右子树都是二叉搜索树。 ...

qq_45768060的博客 2517

二叉树的基本操作和二叉搜索树的增删查(C语言详细注释)

二叉树/二叉搜索树的遍历,创建,输出,增删查

weixin_73373302的博客 245

C++ 二叉树的基本操作

一:目的 用C++实现二叉树的基本操作,建立和遍历; 二:介绍 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历。 它的前序遍历顺序为:ABDGHCEIF(规则是先是

nichengwuxiao的博客 1万+

【Java笔记】 二叉树基础及基本操作

二叉树基础以及一些二叉树的基本操作代码!!!

Origin_life的博客 1988

初识二叉树和二叉树的基本操作

子树是不相交的;除了根结点外,每个结点有且仅有一个父结点一棵N个结点的树有N-1条边。非树:或者为空或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

2301_77572338的博客 2036

用python实现二叉树的基本操作

二叉树基本操作: 创建二叉树 (need) 递归遍历二叉树 (need) 1)前序遍历:“根-左-右” 2)中序遍历:“左-根-右” 3)后序遍历:“左-右-根” 非递归遍历二叉树 1)前序遍历 2)中序遍历 3)后序遍历 创建二叉树,如下图: 手动创建二叉树: 方法一: A, B, C, D, E, F = [BinaryTreeNode(x) for x in '123456'...

weixin_42906066的博客 1703

二叉树的基本操作(C语言)

要介绍二叉树的基本操作,首先介绍一下二叉树的结点: typedef struct node { char data; struct node *lchild; struct node *rchild; }BiTNode; 包括该结点的值、指向左孩子的指针和指向右孩子的指针。 1.先序构造二叉树 BiTNode *creatBiTree() { char...

一只在校程序猿的技术贴 8895

二叉树的遍历和基本操作(Java实现)

二叉树的三种遍历方式详细分解步骤,手把手教你保你学会。带你学会实现二叉树的所有基本操作代码,

qq_73471456的博客 3513

二叉树的类型定义与基本操作

二叉树的类型定义与基本操作 树结构是一类重要的非线性数据结构,在客观世界中广泛存在。树在计算机领域中也得到了广泛的应用,尤以二叉树最为常用。本文重点讨论二叉树的基本操作。 1. 二叉树的类型定义 二叉树通常由三个域组成:数据域、左孩子指针域和右孩子指针域。 其类型定义为: typedef struct BiNode { char data; // 数据域 struct BiNode* lchild, * rchild; // 左右孩子指针域 }Bi

qq_45801780的博客 5475
上一篇: 重建二叉树
下一篇: Integer对象初始化过程[缓存机制]
Young-_-D
博客等级 码龄8年 62粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值