二叉树学习笔记

一、树的概念

树是一种非线性的结构,它是由n个有限结点组成的一个具层次关系的集合。(像一颗倒着的树)

特点:

有一个特殊的结点,称之为根结点,根结点没有前驱结点

除了根节点以外,其余节点别分成M个互不相交的集合,每一个集合又是一颗与树类似的子树,每颗子树的根节点有且只有一个前驱结点,可以有0或n个后继结点

特别注意::

  • 树形结构中,子树之间不能有交集,否则就不是树形结构
  • 除了根结点之外,每一个结点都只有一个父结点

例如:

1.树的重要名词

结点的度:一颗树含有的所有子树就是这个节点的度(如D的节点的度是:3);

树的度:一棵树中,所有结点度的最大值称为树的度(如图上树的度是3);

叶子结点或终端结点:度为0的结点称为叶结点(如图上的 G,H,I,J,F);

双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点(如图上的B的傅父亲节点是A);

孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点(如图上的A的孩子节点是b,c);

根结点:一棵树中,没有双亲结点的结点(如上图A);

结点的层次:从根开始定义起,根为第1层,根的子结点为第2层以此类推;

树的高度或深度:树中结点的最大层次( 如上图:树的高度为4);

森林:由m(m>=0)棵互不相交的树组成的集合称为森林;

二、树的表示法

树结构相对线性表就比较复杂了,实际中树有很多种表示方式,如:双亲表示法, 孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。最常用的孩子兄弟表示法。

  static class TreeNode{int val;int child;//表示第一个孩子int childBrother;//表示第二个孩子}

三、二叉树

一棵二叉树是结点的一个有限集合,该集合:

  •  或者为空
  • 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成

1.两种特殊的树

1.1满二叉树

二叉树的每一层的节点都是最大数,则则可二叉树就是满二叉树(如果二叉树有k层,则二叉树的节点个数就是2*n-1)

1.2完全二叉树

对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完 比特就业课 全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。()从上到下,从左向右一次存放)

2. 二叉树的性质⭐⭐

1.如规定二叉树的根结点是第一层,则二叉树的第i层上最多有2*(i-1)个结点。

2.若规定二叉树的根结点为第一层,那么深度为k的二叉树的最大节点数是2*K-1。

3.对于任何一棵二叉树的结点树若为N,度为2的结点数是N2,度为0的结点数是N0,那么N0=N2+1;(任意二叉树的叶子节点比度为2的结点大1)

一棵二叉树有N个结点,那么就有N-1个边

N=N0+N1+N2;

N-1=N1+2*N2;

推导出来

N0=N2+1

4.具有N个结点的完全二叉树,那么他的深度是log2(n+1)向上取整

5.对于具有n个结点的完全二叉树,如果按照从上到下从左到右的编号,第一个编号是0,那么第i个结点:

若i>0双亲为:(i-1)/2;若i=0则是根结点

若2n+1<n,则左孩子是2n+1

若2n+2<n,则右孩子是2n+2

补充:

当结点数为偶数的完全二叉树则有:2N=N0+1+N2;

当结点数为基数的完全二叉树则有:N=N0+N2;

3.二叉树的存储

3.1孩子表示法

 static class TreeNode {private int val;private TreeNode left;private TreeNode right;public TreeNode(int val) {this.val = val;}}

3.2孩子双亲表示法

 static class TreeNode {private int val;private TreeNode left;private TreeNode right;private TreeNode parent;public TreeNode(int val) {this.val = val;}}

4.创建二叉树

 public void createTree(){TreeNode node1=new TreeNode(1);TreeNode node2=new TreeNode(2);TreeNode node3=new TreeNode(3);TreeNode node4=new TreeNode(4);TreeNode node5=new TreeNode(5);TreeNode node6=new TreeNode(6);TreeNode node7=new TreeNode(7);node1.left=node2;node1.right=node3;node2.left=node4;node2.right=node5;node3.left=node6;node3.right=node7;root=node1;}

5.二叉树的遍历http://t.csdnimg.cn/6BtWs

5.1前序遍历(主左右)

5.1.1递归实现
    List<TreeNode> preOrder(TreeNode root) {List<TreeNode> listPre = new ArrayList<>();if (root == null) {return listPre;}listPre.add(root);List<TreeNode> left = preOrder(root.left);listPre.addAll(left);List<TreeNode> right = preOrder(root.right);listPre.addAll(right);return listPre;}

5.1.2非递归实现

 

 public List<Integer> preorderTraversal(TreeNode root) {Stack<TreeNode> stack=new Stack<>();if(root==null){return  new ArrayList<>();}List<Integer> list=new ArrayList<>();stack.push(root);while(!stack.isEmpty()){TreeNode node=stack.pop();list.add(node.val);if(node.right!=null){stack.add(node.right);}if(node.left!=null){stack.add(node.left);}}return list;}

5.2中序遍历(左主右)

5.2.1递归实现
// 中序遍历List<TreeNode> inOrder(TreeNode root) {List<TreeNode> listOrder = new ArrayList<>();if (root == null) {return listOrder;}List<TreeNode> left = inOrder(root.left);listOrder.addAll(left);listOrder.add(root);List<TreeNode> right = inOrder(root.right);listOrder.addAll(right);return listOrder;}

5.2.2非递归实现

public List<Integer> inorderTraversal(TreeNode root) {if(root==null){return  new ArrayList<>();}List<Integer> res=new ArrayList<>();Stack<TreeNode> stack=new Stack<>();while(stack.size()>0 || root!=null) {//不断往左子树方向走,每走一次就将当前节点保存到栈中//这是模拟递归的调用if(root!=null) {stack.add(root);root = root.left;//当前节点为空,说明左边走到头了,从栈中弹出节点并保存//然后转向右边节点,继续上面整个过程} else {TreeNode tmp = stack.pop();res.add(tmp.val);root = tmp.right;}}return res;}

5.3后序遍历(左右主)

5.3.1递归实现

 // 后序遍历List<TreeNode> postOrder(TreeNode root) {List<TreeNode> listPost = new ArrayList<>();if (root == null) {return listPost;}List<TreeNode> left = postOrder(root.left);listPost.addAll(left);List<TreeNode> right = postOrder(root.right);listPost.addAll(right);listPost.add(root);return listPost;}
5.3.2非递归实现

 public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();if (root == null) {return res;}Deque<TreeNode> stack = new LinkedList<TreeNode>();TreeNode prev = null;while (root != null || !stack.isEmpty()) {while (root != null) {stack.push(root);root = root.left;}root = stack.pop();if (root.right == null || root.right == prev) {res.add(root.val);prev = root;root = null;} else {stack.push(root);root = root.right;}}return res;}

5.4层序遍历

 //层序遍历public List<List<Integer>> levelOrder(TreeNode root) {if(root==null){return new ArrayList<>();}List<List<Integer>> ret = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int n = queue.size();List<Integer> path = new ArrayList<>();for (int i = 0; i < n; i++) {TreeNode node=queue.peek();if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}TreeNode tmp = queue.poll();path.add(tmp.val);}ret.add(path);}return ret;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403601.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos 7.9 迁移到 openEuler22.03-LTS-SP3

openEuler移植案例 | 移植操作指南 | openEuler社区官网 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要两台机器&#xff0c; 不通过原因 在待升级节点检查是否有安装x2openEuler-core时, 发现已经安装了,不能作为升级节点。该节点为&#xff1a; 解…

MySQL中处理JSON数据

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 在大数据时代&#xff0c;处理和分析结构化与非结构化数据的能力对于企业的成功至关重要。MySQL作为一种广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;在应对传统结构化数据方面表现出色。然…

c++每日练习记录第1天

笔记&#xff1a; C 中&#xff0c;isalnum 函数用于检查一个字符是否是字母数字字符&#xff0c;isalnum 函数定义在 头文件中。双指针法&#xff0c;双指针法是一种常用的算法技巧&#xff0c;特别适用于处理数组、字符串等线性数据结构中的问题。这种方法通常涉及到两个指针…

12、springboot3 vue3开发平台-前端-记住我功能实现

文章目录 1. 前端用户信息保存2. 登录页面添加3. 后端实现 1. 前端用户信息保存 使用pinia持久化保存用户名密码 src/stores/remember-me.js // 定义 store import { defineStore } from "pinia" import {reactive} from vueexport const useRememberMeStore defi…

图书管理管理系统 (GUI)

目录 Java程序设计课程设计 图书管理管理系统 一、前言 1 研究背景 2 目的和意义 3编程环境与工具 二、图书管理系统概述 1主要业务流程 三、需求分析与设计 1 系统需求分析 2.功能需求 3.性能需求 4. 安全需求 2 数据库设计 3 界面设计 四、 总…

Solidworks二次开发:通过XYZ点的曲线

在SolidWorks中&#xff0c;通过XYZ点创建曲线是一种根据一组点的坐标生成三维曲线的方法。这种方法适用于需要根据特定点集设计曲线的情况&#xff0c;比如在建模复杂几何形状或执行逆向工程时。在SolidWorks中通过XYZ点创建曲线&#xff0c;操作步骤如下 打开SolidWorks并新建…

利用modelscope下载模型

1. modelscope的简介 ModelScope作为一个先进的“模型即服务”(MaaS)平台&#xff0c;它的核心在于汇聚人工智能领域的尖端模型&#xff0c;降低了在现实世界应用这些前沿技术的门槛。该平台通过ModelScope库展现了其强大功能&#xff0c;这一库专为简化开发者体验而设计&…

Element-06.案例

一.目标 实现下面这个页面&#xff0c;表格中的数据使用axois异步加载数据 二.实现步骤 首先在vue项目的views文件夹中新建一个tlias文件夹&#xff0c;用来存储该案例的相关组件。员工页面组件&#xff08;EmpView.vue&#xff09;和部门页面组件&#xff08;DeptView.vue&…

C语言指针详解-上

C语言指针详解-上 前言1.指针的基本概念1.1指针是什么1.2指针的声明与初始化1.3取地址符&和解引用符*& 运算符用于**获取变量的地址*** 运算符用于访问指针指向的值 2.指针的类型常见数据类型的指针指针与数组、字符串数组指针结构体指针函数指针二级指针void指针 3.指…

【数据结构】二叉树(二)遍历

上篇已经了解对二叉树有了大概了解&#xff0c;本篇学习二叉树的前序、中序、后序及层序遍历的递归与非递归共7种遍历方法&#xff0c;快收藏吧~ 目录 1、前序遍历 递归方式&#xff1a; 迭代方式&#xff1a; 2、中序遍历 递归方式&#xff1a; 迭代方式&#xff1a; …

XXX【4】策略模式

如上图所示&#xff0c;如果要加入一个新的货币&#xff0c;那么就需要对类中的Calculate函数进行修改&#xff0c;这违背了封闭开放原则。 上图中的方式更加合适&#xff0c;搞一个抽象类&#xff08;方法中可以用多态调用&#xff09;&#xff0c;然后每个货币自己是一个类&a…

每日学习笔记:C++ STL之堆栈容器stack

目录 stack定义 核心接口 stack class声明 stack class定义 用户自定义的Stack Class C11特色的插入元素的新形式 运用实例 stack定义 核心接口 stack class声明 stack class定义 用户自定义的Stack Class C11特色的插入元素的新形式 运用实例

数据结构(邓俊辉)学习笔记】优先级队列 07——堆排序

1.算法 作为完全二叉堆的一个应用&#xff0c;这节来介绍堆排序算法。 是的&#xff0c;谈到优先级队列&#xff0c;我们很自然地就会联想到排序。因为就其功能而言&#xff0c;包括完全二叉堆在内的任何一种优先级队列都天生地具有选取功能&#xff0c;也就是选取其中的最大…

【mkdir rmdir】Centos/Linux mkdir rmdir命令详细介绍

【mkdir & rmdir】Centos/Linux mkdir & rmdir命令详细介绍 简介 mkdir rmdir 简介 mkdir 命令和 rmdir 命令是在 linux 当中比较常用的两个命令&#xff0c;这两个命令前者是创建空目录&#xff0c;后者是删除空目录。rmdir 命令的定位比较尴尬它的功能可以被 rm 命…

“论面向服务架构设计及其应用”写作框架,软考高级,系统架构设计师

论文真题 面向服务架构&#xff08;Service-Oriented Architecture, SOA&#xff09; 是一种应用框架&#xff0c;将日常的业务应用划分为单独的业务功能服务和流程&#xff0c;通过采用良好定义的接口和标准协议将这些服务关联起来。通过实施基于SOA的系统架构&#xff0c;用…

版本更新 《坚持学习计时器》软件V3.1 更新内容:自动实时显出

&#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&#xff0c;探索未知&#xff0c;激发潜能&#xff0c;每一步都意义非凡。 版本更新 《坚持学习…

海量数据处理商用短链接生成器平台 - 1

第一章 海量数据处理商用短链接生成器平台介绍 第1集 什么是短链接生成器 短链接生成器是一种工具&#xff0c;可以将较长的链接转换成较短的链接。这种工具在许多场景中都很有用&#xff0c;包括营销、社交媒体分享和数据报告等。以下是一些关于短链接生成器的优点和作用&…

ubuntu20.04挂载机械硬盘

环境说明 1.基于清华源地址下载的ubuntu20.04制作的系统盘&#xff0c;然后安装在PC上&#xff08;固态硬盘&#xff09; 2.机械硬盘无法看见 目的 挂载机械硬盘&#xff0c;开机就能自动启动/挂载 参考链接 https://blog.csdn.net/qq_35624642/article/details/137713143…

Socket编程TCP 基础

一.什么是Socket(套接字&#xff09; 定义&#xff1a;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程&#x…

C:每日一练:单身狗(2.0版本)

前言&#xff1a; 今天在刷题的时候突然看到一道题&#xff0c;疑似一位故题。仔细一看&#xff0c;欸&#xff01;这不是就是单身狗的升级版吗&#xff1f;我想那必须再安排一篇&#xff0c;不过由于本篇文章与上一篇单身狗文章所涉及的知识点基本相同&#xff0c;所以还请大…