我有一個多節點樹,我試圖用指定的深度填充樹(可以是用戶輸入或常量變數)。每個節點將有 7 個孩子,每個孩子將有 7 個孩子,依此類推。問題是遞回地添加孩子
這是使用常規方法的方法
MyTreeNode root = new MyTreeNode(new int[6][7]);
addChildren(root);// depth1
addChildrenToChildren(root.getChildren());// depth2
for (int i = 0; i < 7; i ) {
addChildrenToChildren(root.getChildren().get(i).getChildren()); // depth3
}
for (int i = 0; i < 7; i ) {
for (int j = 0; j < 7; j ) {
addChildrenToChildren(root.getChildren().get(i).getChildren().get(j).getChildren()); // depth4
}
}
使用的方法
private static void addChildrenToChildren(List<MyTreeNode> children) {
for(MyTreeNode child : children){
addChildren(child);
}
}
private static void addChildren(MyTreeNode root) {
root.addChildren(Arrays.asList(
new MyTreeNode(new int[6][7]),
new MyTreeNode(new int[6][7]),
new MyTreeNode(new int[6][7]),
new MyTreeNode(new int[6][7]),
new MyTreeNode(new int[6][7]),
new MyTreeNode(new int[6][7]),
new MyTreeNode(new int[6][7])
));
}
我試過做什么
public static void depth(MyTreeNode root, int n){
if (n == 1){
addChildren(root);
} else {
for (int i = 0; i < 7; i ) {
addChildrenToChildren(root.getChildren());
depth(root.getChildren().get(i), n - 1);
}
}
}
我的樹節點類
public class MyTreeNode{
private int[][] grid;
private List<MyTreeNode> children = new ArrayList<MyTreeNode>();
private MyTreeNode parent = null;
public MyTreeNode(int[][] grid) {
this.grid = grid;
}
public void addChild(MyTreeNode child) {
child.setParent(this);
this.children.add(child);
}
public void addChild(int[][] grid) {
MyTreeNode newChild = new MyTreeNode(grid);
this.addChild(newChild);
}
public void addChildren(List<MyTreeNode> children) {
for(MyTreeNode t : children) {
t.setParent(this);
}
this.children.addAll(children);
}
public List<MyTreeNode> getChildren() {
return children;
}
public int[][] getGrid() {
return grid;
}
public void setGrid(int[][] grid) {
this.grid = grid;
}
private void setParent(MyTreeNode parent) {
this.parent = parent;
}
public MyTreeNode getParent() {
return parent;
}
}
uj5u.com熱心網友回復:
在您嘗試遞回時,addChildrenToChildren(root.getChildren())執行了 7 次——這是不對的。此外,您不需要addChildrenToChildren,因為這將是遞回呼叫的作業。addChildren(root);相反,當n大于 1時,您也應該呼叫。與基本情況的唯一區別是對每個孩子進行遞回呼叫的回圈。
我也會將基本情況視為n0,這樣主呼叫者甚至可以用n等于 0 來呼叫它并獲得相應的結果(然后不添加子項):
public static void depth(MyTreeNode root, int n){
if (n <= 0) return; // Nothing to do
addChildren(root);
for (MyTreeNode child : root.getChildren()) {
depth(child, n - 1);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/533949.html
標籤:爪哇递归树
上一篇:在使用@IBOutletCollection擴展ObjC子類的Swift類中不符合鍵值編碼
下一篇:C中的回溯迷宮,有障礙物
