代码随想录算法跟练 | Day14 | 二叉树 Part01

devtools/2024/9/24 13:22:31/

个人博客主页:http://myblog.nxx.nx.cn
代码GitHub地址:https://github.com/nx-xn2002/Data_Structure.git

Day14

今天,主要是二叉树的基础知识,包括二叉树的结构、存储方式和遍历方式

二叉树的结构

二叉树顾名思义,就是由一个或多个节点组成的树形结构,树形结构中起始的节点被称为根节点,而二叉则表示每个节点有两个子节点,通常将一个节点的左右节点为根节点构成的树称为这个节点的左子树和右子树,如果一个节点的左子树和右子树都为空,它被称为二叉树的叶子结点。

二叉树的存储方式

链式存储

这是我们平时最常见的二叉树的存储方式,每个节点上存储了当前节点的值,还有左右指针分别指向左右子树的根节点的地址。

class TreeNode{int data;TreeNode left;TreeNode right;
}

顺序存储

如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2,按这样的规律进行存储,结果类似二叉树的层序遍历

二叉树的遍历方式

二叉树主要有两种遍历方式:

  1. 深度优先遍历:优先向深处走,遍历到一条路径的叶子结点后,再遍历其他路径
  2. 广度优先遍历:按照深度划分层次,按层次逐渐向下遍历

深度优先遍历

深度优先遍历按照遍历当前节点的先后次序,分为了三种:

  • 前序遍历(中 -> 左 -> 右)
  • 中序遍历(左 -> 中 -> 右)
  • 后序遍历(左 -> 右 -> 中)

我们可以很容易地使用递归来实现这几种遍历方式:

/**
* 前序遍历
*/
public void traversal1(TreeNode root){if(root == null){return;}System.out.println(root.data);traversal(root.left);traversal(root.right);
}/**
* 中序遍历
*/
public void traversal2(TreeNode root){if(root == null){return;}traversal(root.left);System.out.println(root.data);traversal(root.right);
}/**
* 后序遍历
*/
public void traversal3(TreeNode root){if(root == null){return;}traversal(root.left);traversal(root.right);System.out.println(root.data);
}

而相对应的,递归可以通过栈加循环的方式转换为迭代,迭代法如下所示:

/**
* 前序遍历
*/
public List<Integer> traversal1(TreeNode root){List<Integer> res = new ArrayList<>();if(root == null){return res;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){//中TreeNode temp = stack.peek();stack.pop();res.add(temp.data);//右if(temp.right != null){stack.push(temp.right);}//左if(temp.left != null){stack.push(temp.left);}}return res;
}/**
* 中序遍历
*/
public List<Integer> traversal2(TreeNode root){List<Integer> res = new ArrayList<>();if(root == null){return res;}Stack<TreeNode> stack = new Stack<>();stack.push(root);TreeNode cur = root;while (cur != null || !stack.isEmpty()){if (cur != null){stack.push(cur);cur = cur.left;}else{cur = stack.pop();res.add(cur.data);cur = cur.right;}}return res;
}/**
* 后序遍历
*/
public List<Integer> traversal3(TreeNode root){List<Integer> res = new ArrayList<>();if(root == null){return res;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){//中TreeNode temp = stack.peek();stack.pop();res.add(temp.data);//左if(temp.left != null){stack.push(temp.left);}//右if(temp.right != null){stack.push(temp.right);}}Collections.reverse(res);return res;
}

广度优先遍历

广度优先遍历在树形结构中也称为层序遍历,实现思路也比较简单,只需要使用一个队列来进行辅助,先将某一层的所有节点放到队列中,队首出队操作即为对队首元素指向的节点进行遍历,同时依次将队首的非空左右指针入队,这样当某一层元素遍历完毕后,也完成了对下一层所有元素的入队操作。

代码实现:

public List<List<Integer>> traversal(TreeNode node) {List<List<Integer>> res = new ArrayList<>();if(node == null){return res;}Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.offer(node);while (!queue.isEmpty()) {List<Integer> itemList = new ArrayList<Integer>();int len = queue.size();while (len > 0) {TreeNode tmpNode = queue.poll();itemList.add(tmpNode.data);if (tmpNode.left != null){que.offer(tmpNode.left);}if (tmpNode.right != null){que.offer(tmpNode.right);}len--;}res.add(new ArrayList<>(itemList));}
}

总结:
今天学习了二叉树相关的基础知识,需要在以后进行灵活应用


http://www.ppmy.cn/devtools/56034.html

相关文章

区块链技术的核心要素:共识机制、加密技术与分布式账本

区块链听起来像个非常高大上的技术&#xff0c;其实它的核心原理并不难理解。今天我们要聊的就是区块链的三个核心要素&#xff1a;共识机制、加密技术和分布式账本。想象一下区块链是一个巨大的数字笔记本&#xff0c;我们要弄清楚大家如何共同写这个笔记本&#xff0c;又如何…

CSS|05 继承性与优先级

继承性 一、继承性的特点&#xff1a; 1.外层元素身上的样式会被内层元素所继承 2.如果内层元素与外层元素身上的演示相同时&#xff0c;外层元素的样式会被内层元素所覆盖 二、关于继承性的问题 是不是所有样式都能被继承&#xff1f; 答&#xff1a;并不是所有样式能被继承…

计网实训——不相同网段的PC相互通信

目录 提前准备APP路由器指令 实验一1、实验需求&#xff08;1&#xff09;实现同网段的PC相互通信。&#xff08;2&#xff09;实现不相同网段的PC相互通信。&#xff08;3&#xff09;分析相同和不同网段PC通信时MAC地址的变化。 2、实验拓扑3、实验步骤及实验截图&#xff08…

torch.max函数

torch.max函数的用法 第一种第二种 官方介绍&#xff1a;Link 有两种使用场景&#xff0c;输入的参数不同以及返回值不同&#xff1a; 第一种 没有参数dim&#xff0c;但这种只适合一维张量。 torch.max(input) → Tensor Returns the maximum value of all elements in the…

MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解

MoneyPrinterPlus可以使用大模型自动生成短视频&#xff0c;我们可以借助Azure提供的语音服务来实现语音合成和语音识别的功能。 Azure的语音服务应该是我用过的效果最好的服务了&#xff0c;微软还得是微软。 很多小伙伴可能不知道应该如何配置&#xff0c;这里给大家提供一…

微信小程序监听手机系统自带的左右滑动返回事件

微信小程序返回的时候想直接返回首页&#xff0c;但是左滑是上一页&#xff0c;和navigateBack一样&#xff0c;所以就监听了一下&#xff0c;后来一想在页面卸载的时候也可以&#xff0c;还可以使用getCurrentPages&#xff08;&#xff09;方法&#xff0c;拿到是一个数组&am…

第24篇 滑动开关控制LED<二>

Q&#xff1a;如何使用Intel FPGA Monitor Program创建滑动开关控制LED工程并运行呢&#xff1f; A&#xff1a;创建工程的基本过程与前面的Intel FPGA Monitor Program的使用<三>一样&#xff0c;不同的地方是&#xff0c;本实验工程用到了开发板的外设硬件LED和SW&…

独孤思维:这种副业粉丝不要也罢

01 从一个人做副业的状态&#xff0c;就能反映出对生活和工作的状态。 彼此关联且相互影响。 如果副业状态保持激情&#xff0c;充满活力&#xff0c;笃定信心。 多半这样的人&#xff0c;生活和工作&#xff0c;也是积极向上&#xff0c;保持日常学习。 相辅相成。 如果…