链式二叉树的三种遍历(Java递归)
主要上一篇用于区分C语言写的
1 package bitree; 2 3 public class BiTree { 4 5 char data; 6 BiTree lchild, rchild; 7 8 /** 9 * 创建二叉树 10 */ 11 int index = 0; 12 13 BiTree CreateBiTree(BiTree node, String str) { 14 char ch; 15 if (index < str.length()) { 16 ch = str.charAt(index); 17 index++; 18 } else { 19 return null; 20 } 21 if (ch == '#') { 22 node = null; 23 } else { 24 if (node == null) 25 node = new BiTree(); 26 node.data = ch; 27 node.lchild = CreateBiTree(node.lchild, str); 28 node.rchild = CreateBiTree(node.rchild, str); 29 } 30 return node; 31 } 32 33 /** 34 * 判断二叉树是否为空 35 */ 36 int EmptyBiTree(BiTree node) { 37 if (node == null) 38 return 1; 39 return 0; 40 } 41 42 /** 43 * 求树的深度 44 */ 45 public static int DepthBiTree(BiTree node) { 46 int i = 0, j = 0; 47 if (node == null) 48 return 0; 49 if (node.lchild != null) { 50 i = DepthBiTree(node.lchild); 51 } else { 52 i = 0; 53 } 54 if (node.rchild != null) { 55 j = DepthBiTree(node.rchild); 56 } else { 57 j = 0; 58 } 59 60 return i > j ? (i + 1) : (j + 1); 61 } 62 63 /** 64 * 先序遍历 65 */ 66 void PreOrderTraverse(BiTree T) { 67 if (T == null) 68 return; 69 System.out.print(T.data + " "); 70 PreOrderTraverse(T.lchild); 71 PreOrderTraverse(T.rchild); 72 } 73 74 /** 75 * 中序遍历 76 */ 77 void InOrderTraverse(BiTree T) { 78 if (T == null) 79 return; 80 InOrderTraverse(T.lchild); 81 System.out.print(T.data + " "); 82 InOrderTraverse(T.rchild); 83 } 84 85 /** 86 * 后序遍历 87 */ 88 void PostOrderTraverse(BiTree T) { 89 if (T == null) 90 return; 91 PostOrderTraverse(T.lchild); 92 PostOrderTraverse(T.rchild); 93 System.out.print(T.data + " "); 94 } 95 96 /** 97 * 销毁二叉树 98 * 99 */ 100 BiTree DestroyBiTree(BiTree T) { 101 if (T != null) { 102 if (T.lchild != null) { 103 T.lchild = DestroyBiTree(T.lchild); 104 } 105 if (T.rchild != null) { 106 T.rchild = DestroyBiTree(T.rchild); 107 } 108 T = null; 109 } 110 return T; 111 } 112 }
这里面要重点解释的是
创建二叉树时:Java 的参数传值,都是传值方式,基本数据类型传的是数据的拷贝,而对象数据类型传的是地址的拷贝(这里问题在Java篇会细讲)
所以在创建新节点的时候确记不要把我们事先创建的根节点给覆盖掉 ,即node = new BiTree(); 而要做一个if判断。再然后它的lchild ,和rchild 也一样,要通过返回节点来保存下来,然后递归的层层返回,构成二叉树。
销毁二叉树:Java 传递的值已经是被传建好对象的了 ,所以传只有当静态方法才可以直接操作这个对象,静态方法要想调用类信息,要么通过类来调用,要么通过对象。不然会产生一个地址副本,导致真正的根节点无法释放内存。解决办法就是最后再T =null ,手动释放(不知道还有没有其他的办法),这只是个人见解,static 的用法会在Java 篇单独写一篇。
接下来附上测试代码:
1 package bitree; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 7 BiTree T = new BiTree(); // 初始化节点 8 9 T.CreateBiTree(T, "ABDH#K###E##CFI###G#J##"); 10 System.out.println("树的深度:" + BiTree.DepthBiTree(T)); 11 12 System.out.println("开始遍历..."); 13 System.out.println("先序遍历"); 14 T.PreOrderTraverse(T); 15 System.out.println(""); 16 System.out.println("中序遍历"); 17 T.InOrderTraverse(T); 18 System.out.println(""); 19 System.out.println("后序遍历"); 20 T.PostOrderTraverse(T); 21 System.out.println(""); 22 23 System.out.println("销毁二叉树.."); 24 T.DestroyBiTree(T); 25 T = null; // 这一步一定要做 不然根节点无法释放 26 System.out.println("树的深度:" + BiTree.DepthBiTree(T)); 27 28 } 29 }
截图:
卡了好久 这一篇 ,一些细节很迷糊,在CSDN上请教过很多大佬才解决的。主要还是自己Java 基础没打牢 ,奋斗ing~