前言:大家在bbs回帖時常常可以看到樹形的回複形式。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuYjM0cTY3Y2M1YTO1EDMiJTNhljMjZzM3IzYjVTZwgTMvwVOwMzN1ATMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
dfs設計
(1) 為使得Connection僅打開一次,是以以conn作為其中一個遞歸參數,在遞歸全程不關閉conn;
(2)根據存入資料的樹狀結構,由root的id逐層往下走;每到一個結點遞歸掃描該結點的子結點;
(3)列印時進行字元串拼接,故引入第三個遞歸參數:“level”;
資料準備:
create database bbs;
use bbs;
create table article
(
id int primary key auto_increment,
pid int,
rootid int,
title varchar(255),
cont text,
pdate datetime,
isleaf int
);
insert into article values (null, 0, 1, '螞蟻大戰大象', '螞蟻大戰大象', now(), 1);
insert into article values (null, 1, 1, '大象被打趴下了', '大象被打趴下了',now(), 1);
insert into article values (null, 2, 1, '螞蟻也不好過','螞蟻也不好過', now(), 0);
insert into article values (null, 2, 1, '瞎說', '瞎說', now(), 1);
insert into article values (null, 4, 1, '沒有瞎說', '沒有瞎說', now(), 0);
insert into article values (null, 1, 1, '怎麼可能', '怎麼可能', now(), 1);
insert into article values (null, 6, 1, '怎麼沒有可能', '怎麼沒有可能', now(), 0);
insert into article values (null, 6, 1, '可能性是很大的', '可能性是很大的', now(), 0);
insert into article values (null, 2, 1, '大象進醫院了', '大象進醫院了', now(), 1);
insert into article values (null, 9, 1, '護士是螞蟻', '護士是螞蟻', now(), 0);
複制
java封裝
package com.gdufe.bbs;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TreeShow {
public static void main(String[] args) {
TreeShow.show();
}
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/bbs";
conn = DriverManager.getConnection(url, "root", "1234");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void show() {
try {
Connection conn = TreeShow.getConnection();
Statement st = conn.createStatement();
String sql = "select * from article where pid=0";
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getInt("id") + rs.getString("cont"));
tree(conn, rs.getInt("id"), 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void tree(Connection conn, int id, int level) {
Statement st = null;
ResultSet rs = null;
StringBuffer preStr = new StringBuffer(" ");
for (int i = 0; i < level; i++) {
preStr.append(" ");
}
String sql = "select * from article where pid=" + id;
try {
st = conn.createStatement();
rs = st.executeQuery(sql);
while (rs.next()) {
System.out.println(preStr + "" + rs.getInt("id")
+ rs.getString("cont"));
if (rs.getInt("isleaf") != 0) {
tree(conn, rs.getInt("id"), level + 1);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
複制
(注:為了友善代碼了解,故意省去rs,st,conn的close()操作)
輸出結果
1螞蟻大戰大象
2大象被打趴下了
3螞蟻也不好過
4瞎說
5沒有瞎說
9大象進醫院了
10護士是螞蟻
6怎麼可能
7怎麼沒有可能
8可能性是很大的
複制