欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

数据结构Java04【树结构概述、创建、遍历、查找节点、删除节点】

发布时间:2024/9/30 java 46 豆豆
生活随笔 收集整理的这篇文章主要介绍了 数据结构Java04【树结构概述、创建、遍历、查找节点、删除节点】 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

学习地址:【数据结构与算法基础-java版】                  🚀数据结构--Java专栏🚀

  • 笔记01【01-09】【概述、数组基本使用】【源码、课件】
  • 笔记02【10-18】【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】
  • 笔记03【19-27】【(时间、空间复杂度);八大排序(冒泡、快速、插入、希尔、选择、归并、基数、队列基数)】
  • 笔记04【28-33】【树结构(二叉树)概述、创建、遍历、查找节点、删除节点】
  • 笔记05【34-39】【顺序存储二叉树概述、二叉树遍历、堆排序、线索二叉树实现及遍历】
  • 笔记06【40-48】【赫夫曼树、概述、原理分析、代码实现(数据压缩、创建编码表、解码、压缩文件、解压文件)】
  • 笔记07【49-54】【二叉排序树(添加、查找、删除节点)】
  • 笔记08【55-57】【二叉平衡树(AVL)-概述、单旋转、双旋转】
  • 笔记09【58-60】【计算机中数据的存储原理、2-3树的插入原理、B树和B+树】
  • 笔记10【61-63】【哈希表概述、散列函数的设计、散列冲突解决方案】
  • 笔记11【64-67】【图结构概述、图遍历原理(BFS\DFS)、图遍历代码实现】

目   录

P28-4.1树结构概述

P29-4.2二叉树的概述

P30-4.3创建二叉树

P31-4.4遍历二叉树

P32-4.5二叉树中节点的查找

P33-4.6删除二叉树的子树

1、BinaryTree.java

2、Node.java

3、TestBinaryTree.java


P28-4.1树结构概述

顺序存储:开始位置、结束位置,插入数据、删除数据=====》在数据量大的情况下,非常耗费时间!根据下标查找元素。

链表存储:从第1个节点,开始往后找。。。【耗时!!!】

树结构:查找性能、插入性能 较好!!!

 双亲结点:雌雄同体!!!子节点的上一个节点。--------->子节点

路径:从某个节点到达某个节点,途中经过的结点。

节点的度:节点有几个子节点(子树)。

节点的权:给节点赋予的值(节点中存储的数值)。

叶子节点:没有子节点的节点。

树的高度:最大层数。【4】

森林:多个树。

P29-4.2二叉树的概述

二叉树:任何一个节点的子节点数量不超过2! 

二叉树的子节点 分 左节点 和 右节点。

 

满二叉树:所有叶子节点都在最后一层,而且节点的总数为 2^n-1。【n是树的高度!】
满二叉树,是 完全二叉树!

 

完全二叉树:所有叶子节点都在最后一层或倒数第二层,且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续。

从上到下,从左到右 依次 数能数完 就是 完全二叉树!

P30-4.3创建二叉树

双链表 是 前驱 和 后继,树 是 左右孩子结点,不一样!

二叉树的5种形式:

 

P31-4.4遍历二叉树

遍历详解:https://blog.csdn.net/weixin_44949135/article/details/105291651

P32-4.5二叉树中节点的查找

P33-4.6删除二叉树的子树

删除 节点(子树):

  • 无子节点(子节点一并删除!);
  • 有子节点。 
  • 1、BinaryTree.java

    package demo5;public class BinaryTree {Node root;// 设置根节点public void setRoot(Node root) {this.root = root;}// 获取根节点public Node getRoot() {return root;}public void frontShow() {if (root != null) {root.frontShow();}}public void midShow() {if (root != null) {root.midShow();}}public void afterShow() {if (root != null) {root.afterShow();}}public Node frontSearch(int i) {return root.frontSearch(i);}public void delete(int i) {if (root.value == i) {root = null;} else {root.delete(i);}}}

    2、Node.java

    package demo5;public class Node {// 节点的权int value;// 左儿子Node leftNode;// 右儿子Node rightNode;public Node(int value) {this.value = value;}// 设置左儿子public void setLeftNode(Node leftNode) {this.leftNode = leftNode;}// 设置右儿子public void setRightNode(Node rightNode) {this.rightNode = rightNode;}// 前序遍历public void frontShow() {// 先遍历当前节点的内容System.out.print(value + "、");// 左节点if (leftNode != null) {leftNode.frontShow();}// 右节点if (rightNode != null) {rightNode.frontShow();}}// 中序遍历public void midShow() {// 左子节点if (leftNode != null) {leftNode.midShow();}// 当前节点System.out.print(value + "、");// 右子节点if (rightNode != null) {rightNode.midShow();}}// 后序遍历public void afterShow() {// 左子节点if (leftNode != null) {leftNode.afterShow();}// 右子节点if (rightNode != null) {rightNode.afterShow();}// 当前节点System.out.print(value + "、");}// 前序查找public Node frontSearch(int i) {Node target = null;// 对比当前节点的值if (this.value == i) {return this;// 当前节点的值不是要查找的节点} else {// 查找左儿子if (leftNode != null) {// 有可能可以查到,也可以查不到,查不到的话,target还是一个nulltarget = leftNode.frontSearch(i);}// 如果不为空,说明在左儿子中已经找到if (target != null) {return target;}// 查找右儿子if (rightNode != null) {target = rightNode.frontSearch(i);}}return target;}// 删除一个子树public void delete(int i) {Node parent = this;// 判断左儿子if (parent.leftNode != null && parent.leftNode.value == i) {parent.leftNode = null;return;}// 判断右儿子if (parent.rightNode != null && parent.rightNode.value == i) {parent.rightNode = null;return;}// 递归检查并删除左儿子parent = leftNode;if (parent != null) {parent.delete(i);}// 递归检查并删除右儿子parent = rightNode;if (parent != null) {parent.delete(i);}}}

    3、TestBinaryTree.java

    package demo5;public class TestBinaryTree {public static void main(String[] args) {// 创建一颗树BinaryTree binTree = new BinaryTree();// 创建一个根节点Node root = new Node(1);// 把根节点赋给树binTree.setRoot(root);// 创建一个左节点Node rootL = new Node(2);// 把新创建的节点设置为根节点的子节点root.setLeftNode(rootL);// 创建一个右节点Node rootR = new Node(3);// 把新创建的节点设置为根节点的子节点root.setRightNode(rootR);// 为第二层的左节点创建两个子节点rootL.setLeftNode(new Node(4));rootL.setRightNode(new Node(5));// 为第二层的右节点创建两个子节点rootR.setLeftNode(new Node(6));rootR.setRightNode(new Node(7));// 前序遍历树System.out.println("========前序遍历树========");binTree.frontShow();System.out.println("\n");// 中序遍历System.out.println("========中序遍历树========");binTree.midShow();System.out.println("\n");// 后序遍历System.out.println("========后序遍历树========");binTree.afterShow();System.out.println("\n\n");// 前序查找Node result = binTree.frontSearch(3);System.out.println(result);System.out.println(result == rootR);System.out.println("\n\n===============");// 删除一个子树binTree.delete(4);binTree.frontShow();}}

    希望对您有所帮助~

    总结

    以上是生活随笔为你收集整理的数据结构Java04【树结构概述、创建、遍历、查找节点、删除节点】的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。