本文实例讲述了java实现二叉树的建立、计算高度与递归输出操作。分享给大家供大家参考,具体如下:
1. 建立 递归输出 计算高度 前中后三种非递归输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
public class tree_link { private int save = 0 ; private int now = 0 ; scanner sc = new scanner(system.in); /* * 构造函数 */ tree_link(){ } /* * 链表建立 */ public tree link_build(tree head){ // tree head = new tree();//头节点 system.out.println("继续code:1"); int flag = sc.nextint(); if(flag != 1){ return head; }else{ system.out.println("\n\n\n输入 节点信息:"); head.setcode(sc.nextint()); system.out.println("\n建立 左 子树code:1 否则:0"); flag = sc.nextint(); if(flag == 1){ now++; tree ltree = new tree(); head.setltree(ltree); ltree.setfronttree(head);//设置父母节点 link_build( head.getltree() ); } system.out.println("\n当前位置:" + head.getcode()); system.out.println("\n建立 右 子树code:1 否则:0"); flag = sc.nextint(); if(flag == 1){ now++; tree rtree = new tree(); head.setrtree(rtree); rtree.setfronttree(head);//设置父母节点 link_build( head.getrtree() ); } if( now > save ){ save = now; } now--; } return head; } /* * 输出树 */ public tree output(tree head){ int flag; if(head.getcode() == -1){ return head; }else{ system.out.println("\n当前位置:" + head.getcode()); system.out.println(head.getltree() != null); if(head.getltree() != null){ system.out.println("\n访问 左子树:"); output( head.getltree() ); } if(head.getrtree() != null){ system.out.println("\n访问 右子树:"); output( head.getrtree() ); } } return head; } /* * 获得高度 */ public int getsave(){ return this.save; } /* * 非递归 前序遍历 */ public void front_traverse(tree head){ tree star = head;//退出标记 int choose = 1; //左 int flag = 1; //右 system.out.println( "<---前序遍历--->" + head.getcode() );//先访问根 while(true){ if( head.getltree() != null && choose != 0 ){ head = head.getltree(); system.out.println( "<---前序遍历--->" + head.getcode() );//获得信息 flag = 1; }else if( head.getrtree() != null && flag != 0 ){ head = head.getrtree(); system.out.println( "<---前序遍历--->" + head.getcode() ); choose = 1; }else if( flag == 0 && choose == 0 && head == star){ break; }else{ if(head == head.getfronttree().getrtree()){ flag = 0; choose = 0; } if(head == head.getfronttree().getltree()){ choose = 0; flag = 1; } head = head.getfronttree(); system.out.println("获得 父母" + head.getcode()); system.out.println( "\n\n\n" ); } } } /* * 非递归 中序遍历 */ public void center_traverse(tree head){ tree star = head;//退出标记 int choose = 1; //左 int flag = 1; //右 while(true){ if( head.getltree() != null && choose != 0 ){ head = head.getltree(); flag = 1; }else if( head.getrtree() != null && flag != 0 ){ if(head.getltree() == null){//因为左边为空而返回 system.out.println( "<-1--中序遍历--->" + head.getcode()); } head = head.getrtree(); choose = 1; }else if( flag == 0 && choose == 0 && head == star){ break; }else{ int area = 0;//判断哪边回来 flag = 1; choose = 1; if(head == head.getfronttree().getrtree()){ area = 1;//右边回来 flag = 0; choose = 0; } if(head == head.getfronttree().getltree()){ area = 2;//左边回来 choose = 0; flag = 1; } if( head.getltree() == null && head.getrtree() == null ){//因为左边为空而返回 system.out.println( "<-2--中序遍历--->" + head.getcode()); } head = head.getfronttree(); if( area == 2){//因为左边访问完返回 system.out.println( "<-3--中序遍历--->" + head.getcode()); } system.out.println("获得 父母" + head.getcode()); system.out.println( "\n\n\n" ); } } } /* * 非递归 后续遍历 */ public void bottom_traverse(tree head){ tree star = head; //退出标记 int choose = 1 ; //左 int flag = 1 ; //右 while ( true ){ if ( head.getltree() != null && choose != 0 ){ head = head.getltree(); flag = 1 ; } else if ( head.getrtree() != null && flag != 0 ){ head = head.getrtree(); choose = 1 ; } else if ( flag == 0 && choose == 0 && head == star){ break ; } else { int area = 0 ; //判断哪边回来 flag = 1 ; choose = 1 ; if (head == head.getfronttree().getrtree()){ area = 1 ; //右边回来 flag = 0 ; choose = 0 ; } if (head == head.getfronttree().getltree()){ choose = 0 ; flag = 1 ; } if (head.getrtree() == null ){ //因为右边为空而返回 system.out.println( "<-1--后序遍历--->" + head.getcode()); } head = head.getfronttree(); if ( area == 1 ){ system.out.println( "<-2--后序遍历--->" + head.getcode()); } system.out.println( "获得 父母" + head.getcode()); system.out.println( "\n\n\n" ); } } } } |
2. tree 类实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
public class tree { private int code = - 1 ; private tree fonttree; private tree ltree; private tree rtree; tree(){ this .code = - 1 ; this .ltree = null ; this .rtree = null ; } /* * 树内容查看方法: */ public void setcode(int code){//设置编号 this.code = code; } public int getcode(){ //获取编号 return this.code; } /* * 设置父母指针: */ public void setfronttree(tree front){ this.fonttree = front; } public tree getfronttree(){ system.out.println("获得 父母"); return this.fonttree; } /* * 设置左子女: */ public void setltree(tree ltree){ this.ltree = ltree; } public tree getltree(){ system.out.println("获得左子树"); return this.ltree; } /* * 设置右子女: */ public void setrtree(tree rtree){ this .rtree = rtree; } public tree getrtree(){ system.out.println( "获得右子树" ); return this .rtree; } } |
3. 主函数测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class mainactivity { scanner sc = new scanner(system.in); public static void main(string[] args) { tree head = new tree(); tree_link link_1st = new tree_link(); head = link_1st.link_build(head); system.out.println( "build succeed !" ); system.out.println( "\n二叉树高度-->" + link_1st.getsave()); link_1st.output(head); system.out.println( "output over !" ); system.out.println( "\n\n<----------------前------------------>\n前序访问根:" ); link_1st.front_traverse(head); system.out.println( "\n\n<----------------中------------------>\n中序访问根:" ); link_1st.center_traverse(head); system.out.println( "\n\n<----------------后------------------>\n后序访问根:" ); link_1st.bottom_traverse(head); system.out.println( "\n\n\n\ntext over !\n\n\n" ); } } |
希望本文所述对大家java程序设计有所帮助。
原文链接:https://blog.csdn.net/qq_43377749/article/details/83475907
查看更多关于Java实现二叉树的建立、计算高度与递归输出操作示例的详细内容...