参考:https://www.jianshu.com/p/bf73c8d50dc2
二叉树:任何一个节点的子节点数量不超过2,二叉树的子节点分为左节点和右节点。
满二叉树:所有叶子节点都在最后一层,而且节点的总数为:2^n-1,n是树的高度。
完全二叉树:所有叶子节点都在最后一层或倒数第二层,且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续。
创建二叉树:
| 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.println(value); |
| |
| if(leftNode!=null) { |
| leftNode.frontShow(); |
| } |
| |
| if(rightNode!=null) { |
| rightNode.frontShow(); |
| } |
| } |
| |
| |
| public void midShow() { |
| |
| if(leftNode!=null) { |
| leftNode.midShow(); |
| } |
| |
| System.out.println(value); |
| |
| if(rightNode!=null) { |
| rightNode.midShow(); |
| } |
| } |
| |
| |
| public void afterShow() { |
| |
| if(leftNode!=null) { |
| leftNode.afterShow(); |
| } |
| |
| if(rightNode!=null) { |
| rightNode.afterShow(); |
| } |
| |
| System.out.println(value); |
| } |
| |
| |
| public Node frontSearch(int i) { |
| Node target=null; |
| |
| if(this.value==i) { |
| return this; |
| |
| }else { |
| |
| if(leftNode!=null) { |
| |
| target = 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); |
| } |
| } |
| |
| } |
| 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); |
| } |
| } |
| |
| } |
| 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)); |
| |
| binTree.frontShow(); |
| System.out.println("==============="); |
| |
| binTree.midShow(); |
| System.out.println("==============="); |
| |
| binTree.afterShow(); |
| System.out.println("==============="); |
| |
| Node result = binTree.frontSearch(5); |
| System.out.println(result); |
| |
| System.out.println("==============="); |
| |
| binTree.delete(4); |
| binTree.frontShow(); |
| |
| } |
| |
| } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
· 聊一聊 C#异步 任务延续的三种底层玩法
· 上位机能不能替代PLC呢?
· 2024年终总结:5000 Star,10w 下载量,这是我交出的开源答卷
· 一个适用于 .NET 的开源整洁架构项目模板
· .NET Core:架构、特性和优势详解