1. java 遞歸資料庫生成 樹形結構問題
1、准備表結構及對應的表數據
a、表結構:
create table TB_TREE
(
CID NUMBER not null,
CNAME VARCHAR2(50),
PID NUMBER //父節點
)
b、表數據:
insert into tb_tree (CID, CNAME, PID) values (1, '中國', 0);
insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1);
insert into tb_tree (CID, CNAME, PID) values (3, '廣東省', 1);
insert into tb_tree (CID, CNAME, PID) values (4, '上海市', 1);
insert into tb_tree (CID, CNAME, PID) values (5, '廣州市', 3);
insert into tb_tree (CID, CNAME, PID) values (6, '深圳市', 3);
insert into tb_tree (CID, CNAME, PID) values (7, '海珠區', 5);
insert into tb_tree (CID, CNAME, PID) values (8, '天河區', 5);
insert into tb_tree (CID, CNAME, PID) values (9, '福田區', 6);
insert into tb_tree (CID, CNAME, PID) values (10, '南山區', 6);
insert into tb_tree (CID, CNAME, PID) values (11, '密雲縣', 2);
insert into tb_tree (CID, CNAME, PID) values (12, '浦東', 4);
2、TreeNode對象,對應tb_tree
public class TreeNode implements Serializable {
private Integer cid;
private String cname;
private Integer pid;
private List nodes = new ArrayList();
public TreeNode() {
}
//getter、setter省略
}
3、測試數據
public class TreeNodeTest {
@Test
public void loadTree() throws Exception{
System.out.println(JsonUtils.javaToJson(recursiveTree(1)));
}
/**
* 遞歸演算法解析成樹形結構
*
* @param cid
* @return
* @author jiqinlin
*/
public TreeNode recursiveTree(int cid) {
//根據cid獲取節點對象(SELECT * FROM tb_tree t WHERE t.cid=?)
TreeNode node = personService.getreeNode(cid);
//查詢cid下的所有子節點(SELECT * FROM tb_tree t WHERE t.pid=?)
List childTreeNodes = personService.queryTreeNode(cid);
//遍歷子節點
for(TreeNode child : childTreeNodes){
TreeNode n = recursiveTree(child.getCid()); //遞歸
node.getNodes().add(n);
}
return node;
}
}
輸出的json格式如下:
{
"cid": 1,
"nodes": [
{
"cid": 2,
"nodes": [
{
"cid": 11,
"nodes": [
],
"cname": "密雲縣",
"pid": 2
}
],
"cname": "北京市",
"pid": 1
},
{
"cid": 3,
"nodes": [
{
"cid": 5,
"nodes": [
{
"cid": 7,
"nodes": [
],
"cname": "海珠區",
"pid": 5
},
{
"cid": 8,
"nodes": [
],
"cname": "天河區",
"pid": 5
}
],
"cname": "廣州市",
"pid": 3
},
{
"cid": 6,
"nodes": [
{
"cid": 9,
"nodes": [
],
"cname": "福田區",
"pid": 6
},
{
"cid": 10,
"nodes": [
],
"cname": "南山區",
"pid": 6
}
],
"cname": "深圳市",
"pid": 3
}
],
"cname": "廣東省",
"pid": 1
},
{
"cid": 4,
"nodes": [
{
"cid": 12,
"nodes": [
],
"cname": "浦東",
"pid": 4
}
],
"cname": "上海市",
"pid": 1
}
],
"cname": "中國",
"pid": 0
}
2. java 目錄樹如何檢索子級返回
Java中使用遞歸演算法實現查找樹形結構中所有父級和子級節點,用遞歸加一個全局變數標記是否已經找到,然後返回。
截取後面的一段例子:
if (list[i].ID.Equals(id) || found)
found = true;
return;
拓展資料
遞歸查詢子級節點
1.一個節點可能有多個子級節點,每個自己節點可能還有更多的子級節點。
2.所以遞歸時的參數用一個list來接受,首先遍歷參數list,分別查詢pid為參數id的對象。
3.每一個參數id所查詢返回的數據是一個對象的list。
4.遍歷list獲取符合條件的對象的id值,一份存到temp中用作遞歸的參數,並存到全局變數中用來獲取所有符合條件的id。
3. java中遞歸演算法是什麼怎麼算的
Java遞歸演算法是基於Java語言實現的遞歸演算法。遞歸演算法是一種直接或者間接調用自身函數或者方法的演算法。遞歸演算法實質是把問題分解成規模縮小的同類問題的子問題,然後遞歸調用方法表示問題的解。遞歸往往能給我們帶來非常簡潔非常直觀的代碼形式,從而使我們的編碼大大簡化,然而遞歸的思維確實跟我們的常規思維相逆的,通常都是從上而下的思維問題,而遞歸趨勢從下往上的進行思維。
二、遞歸演算法解決問題的特點:
【1】遞歸就是方法里調用自身。
【2】在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
【3】遞歸演算法代碼顯得很簡潔,但遞歸演算法解題的運行效率較低。所以不提倡用遞歸設計程序。
【4】在遞歸調用的過程中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等,所以一般不提倡用遞歸演算法設計程序。
【5】在做遞歸演算法的時候,一定把握出口,也就是做遞歸演算法必須要有一個明確的遞歸結束條件。這一點是非常重要的。其實這個出口就是一個條件,當滿足了這個條件的時候我們就不再遞歸了。
三、代碼示例:
代碼執行流程圖如下:
此程序中n=5就是程序的出口。
4. 用java遞歸方法實現
publicintfun(intn){
if(n==0||n==1)return1;
returnn*fun(n-1);
}
5. Java數據結構二叉樹深度遞歸調用演算法求內部演算法過程詳解
二叉樹
1
2 3
4 5 6 7
這個二叉樹的深度是3,樹的深度是最大結點所在的層,這里是3.
應該計算所有結點層數,選擇最大的那個。
根據上面的二叉樹代碼,遞歸過程是:
f(1)=f(2)+1 > f(3) +1 ? f(2) + 1 : f(3) +1
f(2) 跟f(3)計算類似上面,要計算左右結點,然後取大者
所以計算順序是f(4.left) = 0, f(4.right) = 0
f(4) = f(4.right) + 1 = 1
然後計算f(5.left) = 0,f(5.right) = 0
f(5) = f(5.right) + 1 =1
f(2) = f(5) + 1 =2
f(1.left) 計算完畢,計算f(1.right) f(3) 跟計算f(2)的過程一樣。
得到f(3) = f(7) +1 = 2
f(1) = f(3) + 1 =3
if(depleft>depright){
returndepleft+1;
}else{
returndepright+1;
}
只有left大於right的時候採取left +1,相等是取right
6. java實現多叉樹的某層遍歷,求思路。一棵多叉樹有M層,子節點數不定,要求列印輸出第N層的節點。說
在Java中實現多叉樹某層節點的遍歷,通常採用遞歸的方法。從根節點開始,逐步向下訪問直到目標層。下面是一個示例代碼,展示如何列印輸出第N層的節點:
定義一個類Node,表示多叉樹的節點。每個節點包含一個名稱name和一個子節點數組children:
class Node {
private String name; // 節點名稱
private Node[] children; // 子節點
public Node(String name, Node[] children) {
this.name = name;
this.children = children;
}
// getter,setter
}
接下來定義一個方法layerX,輸入參數包括一個存儲結果的列表layer、當前節點p和要訪問的層數x:
public void layerX(List layer, Node p, int x) {
if (p != null) {
// 如果當前節點達到訪問層的節點
if (x == 1) {
layer.add(p);
}
// 繼續遞歸訪問子節點
Node[] c = p.getChildren();
if (c != null) {
for (Node n : c) {
layerX(layer, n, x - 1);
}
}
}
這個方法首先檢查當前節點是否為null,如果不是null,則進入下一步。接下來判斷當前節點是否為要訪問的層,如果是,則將該節點添加到結果列表中。然後遞歸訪問當前節點的所有子節點,遞歸層數減一。這個過程會一直持續,直到所有節點都被訪問到。
通過這種方式,可以實現對多叉樹的某層節點進行遍歷,並將結果列印輸出。這種方法具有良好的擴展性和靈活性,適用於各種復雜的多叉樹結構。
需要注意的是,上述代碼中的方法實現僅用於示例,實際使用時可能需要根據具體需求進行適當的調整和優化。