我的main函式是這樣的:
public static void main(String[] args) {
Search_BTree tree2=null,pre=new Search_BTree();
tree2 = Search_BTree.autoCreate(3);
tree2.createSearchBTreeEn(tree2,pre);
}Search_BTree類是這樣的:
public class Search_BTree {
public Search_BTree Left;
public Search_BTree Right;
public String str;
public int ltag;//1表示指向前驅或后繼 0 表示指向孩子
public int rtag;
//變為線索二叉
public void createSearchBTreeEn(Search_BTree tree,Search_BTree pre){
if(null == tree)
return ;
createSearchBTreeEn(tree.Left,pre);
if(null == tree.Left){
tree.ltag=1;
tree.Left=pre;
}
if(null == pre.Right){
pre.rtag=1;
pre.Right=tree;
}
pre = tree;
createSearchBTreeEn(tree.Right,pre);
}
//前序遍歷創建二叉樹
public static Search_BTree createSearchBTree(Search_BTree tree){
String str = new Scanner(System.in).next();
if(!str.equals("#")){
tree=new Search_BTree(str);
tree.Left=createSearchBTree(tree.Left);
tree.Right=createSearchBTree(tree.Right);
return tree;
}
return null;
}
//自動創建滿二叉樹
public static Search_BTree autoCreate(int k){
int sum = (int)Math.pow(2,k)-1;
int hasChildren = (int)Math.pow(2,k-1)-1;
Search_BTree list[] = new Search_BTree[sum+1];
for(int i=1;i<=sum;i++){
list[i]=new Search_BTree(String.valueOf(i));//全部賦值1,2,3,4.....
}
for(int i=1;i<=hasChildren;i++){
list[i].Left=list[2*i];
list[i].Right=list[2*i+1];
}
return list[1];
}
//層次遍歷
public void Hierarchy(Search_BTree tree){
int current=-1,position=0;
List<Search_BTree> list = new ArrayList();
if(tree!=null){
list.add(tree);
while(current!=position){
current++;
if(list.get(current).Left!=null){
list.add(list.get(current).Left);
position++;
}
if(list.get(current).Right!=null){
list.add(list.get(current).Right);
position++;
}
}
for (Search_BTree node : list){
System.out.println(node.str);
}
}
}
//層次遍歷遞回
public void HierarchyDG(Search_BTree tree,int k,List list){
if(tree!=null){
if(k==1){
list.add(tree);
}
if(tree.Left!=null){
list.add(tree.Left);
}
if(tree.Right!=null){
list.add(tree.Right);
}
if(tree.Left!=null){
HierarchyDG(tree.Left,k+1,list);
}
if(tree.Right!=null){
HierarchyDG(tree.Right,k+1,list);
}
}
}
public Search_BTree() {
}
public Search_BTree(String str) {
this.str = str;
}
}問題在于Search_BTree里面, createSearchBTreeEn方法里面有一句 pre = tree; 可以 我在自動創建的滿二叉樹里面,單步除錯后,發現這句話并沒有傳遞參考啊,跳出來后,pre又變回原來的值了,之前pre = tree這里改變了指標的指向沒用了。!!?這是為啥,求大神幫忙啊!!
uj5u.com熱心網友回復:
上面的問題我用static變數已經解決了,把pre設成一個全域的static靜態變數。換個問題,我下面兩個層次遍歷的,非遞回的方法是對的,可以遞回的層次遍歷有問題,我也知道也有問題,可是我想不出來如何遞回寫出層次遍歷了。
uj5u.com熱心網友回復:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Search_BTree {
public Search_BTree Left;
public Search_BTree Right;
public String str;
public int ltag;//1表示指向前驅或后繼 0 表示指向孩子
public int rtag;
//變為線索二叉
public void createSearchBTreeEn(Search_BTree tree,Search_BTree pre){
if(null == tree)
return ;
createSearchBTreeEn(tree.Left,pre);
if(null == tree.Left){
tree.ltag=1;
tree.Left=pre;
}
if(null == pre.Right){
pre.rtag=1;
pre.Right=tree;
}
pre = tree;
createSearchBTreeEn(tree.Right,pre);
}
//前序遍歷創建二叉樹
public static Search_BTree createSearchBTree(Search_BTree tree){
String str = new Scanner(System.in).next();
if(!str.equals("#")){
tree=new Search_BTree(str);
tree.Left=createSearchBTree(tree.Left);
tree.Right=createSearchBTree(tree.Right);
return tree;
}
return null;
}
//自動創建滿二叉樹
public static Search_BTree autoCreate(int k){
int sum = (int)Math.pow(2,k)-1;
int hasChildren = (int)Math.pow(2,k-1)-1;
Search_BTree list[] = new Search_BTree[sum+1];
for(int i=1;i<=sum;i++){
list[i]=new Search_BTree(String.valueOf(i));//全部賦值1,2,3,4.....
}
for(int i=1;i<=hasChildren;i++){
list[i].Left=list[2*i];
list[i].Right=list[2*i+1];
}
return list[1];
}
//層次遍歷
public void Hierarchy(Search_BTree tree){
int current=-1,position=0;
List<Search_BTree> list = new ArrayList();
if(tree!=null){
list.add(tree);
while(current!=position){
current++;
if(list.get(current).Left!=null){
list.add(list.get(current).Left);
position++;
}
if(list.get(current).Right!=null){
list.add(list.get(current).Right);
position++;
}
}
for (Search_BTree node : list){
System.out.println(node.str);
}
}
}
//層次遍歷遞回
public void HierarchyDG(int k,List list,List<Search_BTree> children){
if(children.size() == 0)
return;
if(k==1){
for (Search_BTree search_BTree : children) {
list.add(search_BTree);
}
}
List<Search_BTree> newChildren = new ArrayList<Search_BTree>();
for (int j = 0; j < children.size(); j++) {
Search_BTree tree = children.get(j);
if(tree!=null){
if(tree.Left!=null){
list.add(tree.Left);
newChildren.add(tree.Left);
}
if(tree.Right!=null){
list.add(tree.Right);
newChildren.add(tree.Right);
}
// if(tree.Left!=null){
// HierarchyDG(tree.Left,k+1,list);
// }
// if(tree.Right!=null){
// HierarchyDG(tree.Right,k+1,list);
// }
}
}
HierarchyDG(k+1, list, newChildren);
}
public Search_BTree() {
}
public Search_BTree(String str) {
this.str = str;
}
public static void main(String[] args) {
Search_BTree tree2=null;
tree2 = Search_BTree.autoCreate(3);
Search_BTree search_BTree = new Search_BTree();
List<Search_BTree> list = new ArrayList<Search_BTree>();
List<Search_BTree> children = new ArrayList<Search_BTree>();
children.add(tree2);
search_BTree.HierarchyDG(1, list, children);
for (Search_BTree item : list) {
System.out.println(item.str);
}
}
}
就改了遞回的地方,你試試
uj5u.com熱心網友回復:
演算法有點意思啊,代碼問題不大。createSearchBTreeEn()的引數pre,傳的是物件參考變數啊,退出方法后,pre就變回呼叫之前的變數值,參考之前的物件了。Java就是這樣,不像C/C++,可以傳指標,然后把更新回傳到外層。如果要回傳更新的pre,確實沒有特別好的辦法,要么把pre做成static或全域變數,要么通過方法的回傳值回傳,要么封裝一個類作引數,然后通過類中的成員來回傳多個值。
另外,那個層次遍歷遞回HierarchyDG()方法也有點怪,實際遍歷的順序既不是前序后序或中序,也不是深度優先或廣度優先遍歷。Hierarchy()方法倒是廣度優先遍歷的。
uj5u.com熱心網友回復:
可以在main方法里面定義一個變數,然后將這個變數傳到遞回方法中,遞回方法重復用這個變數uj5u.com熱心網友回復:
如果只有兩層遞回用lambda會比較簡單簡潔uj5u.com熱心網友回復:

這是我上次專案里面用到的兩層選單不知道能不能幫助你
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/9648.html
標籤:Java SE
上一篇:java poi寫入Excel,這是一個已經存在的表格,怎么樣做到寫入F列時,不影響前面列的內容
下一篇:查詢分頁
