二叉树前序中序后序
二叉树
前序遍历:先输出父节点,再遍历左子树和右子树
中序遍历:先输出左子树,再遍历父节点,最后为右子树
后序遍历:先输出左子树,再遍历右子树,最后为父节点
小结:看输出父节点的顺序,就确定是前序还是中序后序
遍历步骤:
1、创建一个二叉树
2、前序遍历:
2.1 先输出当前节点(根节点)
2.2 如果左子节点不为空,则递归继续前序遍历
2.3 如果右子节点不为空,则递归继续前序遍历
3、 中序遍历:
3.1 如果当前节点的左子节点不为空,则递归中序遍历
3.2 输出当前节点
3.3 如果当前节点的右子节点不为空,则递归中序遍历
4、后序遍历:
4.1 如果当前节点的左字节点不为空,则递归后序遍历
4.2 如果当前节点的右子节点不为空,则递归后序遍历
4.3 输出当前节点
1 public class BinaryTreeDemo { 2 public static void main(String[] args) { 3 //先需要创建一棵二叉树 4 BinaryTree binaryTree = new BinaryTree(); 5 EmpNode root = new EmpNode(1, "aa"); 6 EmpNode emp2 = new EmpNode(2, "bb"); 7 EmpNode emp3 = new EmpNode(3, "cc"); 8 EmpNode emp4 = new EmpNode(4, "dd"); 9 EmpNode emp5 = new EmpNode(5, "ee"); 10 11 //手动创建二叉树,后面学习递归的方式创建二叉树 12 root.setLeft(emp2); 13 root.setRight(emp3); 14 emp3.setRight(emp4); 15 emp3.setLeft(emp5); 16 17 //测试 18 System.out.println("前序遍历"); 19 binaryTree.setRoot(root); 20 binaryTree.preOrder(); 21 22 System.out.println("中序遍历"); 23 binaryTree.setRoot(root); 24 binaryTree.infixOrder(); 25 26 27 System.out.println("后序遍历"); 28 binaryTree.setRoot(root); 29 binaryTree.postOrder(); 30 31 32 } 33 34 } 35 36 //定义一个BinaryTree 37 class BinaryTree{ 38 private EmpNode root; 39 public void setRoot(EmpNode root){ 40 this.root = root; 41 } 42 //前序遍历 43 public void preOrder(){ 44 if (this.root != null){ 45 this.root.preOrder(); 46 }else{ 47 System.out.println("二叉树为空,无法遍历"); 48 } 49 } 50 51 //中序遍历 52 public void infixOrder(){ 53 if (this.root != null){ 54 this.root.infixOrder(); 55 }else{ 56 System.out.println("二叉树为空,无法遍历"); 57 } 58 } 59 60 //后序遍历 61 public void postOrder(){ 62 if (this.root != null){ 63 this.root.postOrder(); 64 }else{ 65 System.out.println("二叉树为空,无法遍历"); 66 } 67 } 68 } 69 70 //先创建HeroNode 71 class EmpNode{ 72 private int no; 73 private String name; 74 private EmpNode left;//默认为null 75 private EmpNode right;//默认为null 76 77 public EmpNode(int no, String name) { 78 this.no = no; 79 this.name = name; 80 } 81 82 public int getNo() { 83 return no; 84 } 85 86 public void setNo(int no) { 87 this.no = no; 88 } 89 90 public String getName() { 91 return name; 92 } 93 94 public void setName(String name) { 95 this.name = name; 96 } 97 98 public EmpNode getLeft() { 99 return left; 100 } 101 102 public void setLeft(EmpNode left) { 103 this.left = left; 104 } 105 106 public EmpNode getRight() { 107 return right; 108 } 109 110 public void setRight(EmpNode right) { 111 this.right = right; 112 } 113 114 @Override 115 public String toString() { 116 return "EmpNode{" + 117 "no=" + no + 118 ", name='" + name + '\'' + 119 '}'; 120 } 121 //编写前序遍历方法 122 123 public void preOrder(){ 124 System.out.println(this);//先输出父节点 125 //递归向左子树前序遍历 126 if (this.left!=null){ 127 this.left.preOrder(); 128 } 129 //递归向右子树前序遍历 130 if (this.right != null){ 131 this.right.preOrder(); 132 } 133 134 } 135 //编写中序遍历方法 136 public void infixOrder(){ 137 //递归向左子树中序遍历 138 if (this.left != null){ 139 this.left.infixOrder();//2,1,3,4 140 } 141 //输出父节点 142 System.out.println(this); 143 //递归向右子树中序遍历 144 if (this.right != null){ 145 this.right.infixOrder(); 146 } 147 } 148 149 //编写后序遍历方法 150 public void postOrder(){ 151 if (this.left != null){ 152 this.left.postOrder(); 153 } 154 if (this.right != null){ 155 this.right.postOrder(); 156 } 157 System.out.println(this); 158 } 159 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具