二叉树的Java实现
import java.util.LinkedList; import java.util.List; public class BinaryTree{ private TreeNode root; public BinaryTree(){} public BinaryTree(TreeNode root){ this.root = root; } public TreeNode getRoot(){ return root; } public void setRoot(TreeNode root){ this.root = root; } /** * create tree */ public void creatTree(int[] datas,List<TreeNode> nodeList){ for(int nodeIndex=0;nodeIndex<datas.length;nodeIndex++){ TreeNode node = new TreeNode(datas[nodeIndex]); nodeList.add(node); } for(int index=0;index<(datas.length)/2-1;index++){ nodeList.get(index).setLeft(nodeList.get(index*2+1)); nodeList.get(index).setRight(nodeList.get(index*2+2)); } int index = datas.length/2-1; nodeList.get(index).setLeft(nodeList.get(index*2+1)); if(datas.length%2==1){ nodeList.get(index).setRight(nodeList.get(index*2+2)); } } /** * node count */ public int getSize(){ return getSize(root); } private int getSize(TreeNode node){ if(node==null){ return 0; }else{ int i=getSize(node.getLeft()); int j=getSize(node.getRight()); return i+j+1; } } /** * leaf cuont */ public int getLeaf(TreeNode root){ int leafCount = 0; if(root==null){ return 0; }else{ if((!root.hasLeft())&&(!root.hasRight())){ leafCount++; } } int i = getLeaf(root.getLeft()); int j = getLeaf(root.getRight()); return i+j+leafCount; } /** * tree height */ public int getHeight(){ return getHeight(root); } private int getHeight(TreeNode node){ if(node==null){ return 0; }else{ int i=getHeight(node.getLeft()); int j=getHeight(node.getRight()); return (i<j)?(j+1):(i+1); } } /** * preOrder */ public void preOrder(TreeNode node){ if(node!=null){ System.out.print(node.getData()+" "); preOrder(node.getLeft()); preOrder(node.getRight()); } } public void nonRecurPreOrder(TreeNode root){ LinkedList<TreeNode> stack =new LinkedList<>(); TreeNode currentNode = root; TreeNode temp; while(currentNode!=null||!stack.isEmpty()){ while(currentNode!=null){ System.out.print(currentNode.getData()+" "); stack.push(currentNode); currentNode=currentNode.getLeft(); } if(!stack.isEmpty()){ temp=stack.pop(); currentNode=temp.getRight(); } } System.out.println(); } /** * inOrder */ public void inOrder(TreeNode node){ if(node!=null){ inOrder(node.getLeft()); System.out.print(node.getData()+" "); inOrder(node.getRight()); } } public void nonRecurInOrder(TreeNode root){ LinkedList<TreeNode> stack = new LinkedList<>(); TreeNode currentNode = root; TreeNode temp; while(currentNode!=null||!stack.isEmpty()){ while(currentNode!=null){ stack.push(currentNode); currentNode=currentNode.getLeft(); } if(!stack.isEmpty()){ temp=stack.pop(); System.out.print(temp.getData()+" "); currentNode=temp.getRight(); } } System.out.println(); } /** * postOrder */ public void postOrder(TreeNode node){ if(node!=null){ postOrder(node.getLeft()); postOrder(node.getRight()); System.out.print(node.getData()+" "); } } public void nonRecurPostOrder(TreeNode root){ LinkedList<TreeNode> stack = new LinkedList<>(); TreeNode currentNode = root; TreeNode prevNode = root; while(currentNode!=null||!stack.isEmpty()){ while(currentNode!=null){ stack.push(currentNode); currentNode=currentNode.getLeft(); } if(!stack.isEmpty()){ TreeNode temp = stack.peek().getRight(); if(temp==null||temp==prevNode){ currentNode=stack.pop(); System.out.print(currentNode.getData()+" "); prevNode=currentNode; currentNode=null; }else{ currentNode=temp; } } } System.out.println(); } public static void main(String[] args) { BinaryTree tree = new BinaryTree(); int[] datas=new int[]{1,2,3,4,5,6,7,8,9}; List<TreeNode> nodeList = new LinkedList<>(); tree.creatTree(datas, nodeList); TreeNode root = nodeList.get(0); System.out.println("\n=====preOrder======"); tree.preOrder(root); System.out.println("\n=====non pre order======"); tree.nonRecurPreOrder(root); System.out.println("\n=====inOrder======="); tree.inOrder(root); System.out.println("\n=====non in order======"); tree.nonRecurInOrder(root); System.out.println("\n=====postOrder====="); tree.postOrder(root); System.out.println("\n=====non post order======"); tree.nonRecurPostOrder(root); System.out.println("\n=====height======="); System.out.println(tree.getHeight(root)); System.out.println("\n=====size========="); System.out.println(tree.getSize(root)); System.out.println("\n=====leaf========="); System.out.println(tree.getLeaf(root)); } } class TreeNode{ private int data; private TreeNode left; private TreeNode right; public TreeNode(){} public TreeNode(int data){ this.data=data; this.left=null; this.right=null; } public TreeNode(int data,TreeNode left,TreeNode right){ this.data=data; this.left=left; this.right=right; } public int getData(){ return data; } public void setData(int data){ this.data = data; } public TreeNode getLeft(){ return left; } public void setLeft(TreeNode left){ this.left = left; } public TreeNode getRight(){ return right; } public void setRight(TreeNode right){ this.right = right; } public boolean hasLeft(){ if(this.getLeft()==null) return false; return true; } public boolean hasRight(){ if(this.getRight()==null) return false; return true; } }
按层遍历
public void laywerOrder(TreeNode root){ if(root==null) return ; LinkedList<TreeNode> list = new LinkedList<>(); list.add(root); TreeNode currentNode = root; while(!list.isEmpty()){ currentNode=list.poll(); System.out.print(currentNode.getData()+" "); if(currentNode.hasLeft()) list.add(currentNode.getLeft()); if(currentNode.hasRight()) list.add(currentNode.getRight()); } }
输出:
=====layer order====== 1 2 3 4 5 6 7 8 9
结果:
=====preOrder====== 1 2 4 8 9 5 3 6 7 =====non pre order====== 1 2 4 8 9 5 3 6 7 =====inOrder======= 8 4 9 2 5 1 6 3 7 =====non in order====== 8 4 9 2 5 1 6 3 7 =====postOrder===== 8 9 4 5 2 6 7 3 1 =====non post order====== 8 9 4 5 2 6 7 3 1 =====height======= 4 =====size========= 9 =====leaf========= 5
请dalao不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构