스

이진 트리 순회... 무한 계층형 트리

· 2023-03-15 (수) 21:40:54 · 1963 · 2

배움이 짧아 트리를 쭈욱 파고 들다가, 이진 트리 순회라는 것을 알게 되었습니다.

배우진 않았지만, 늘상 사용하던 알고리즘의 하나였는데요. 자세히 보니까 mysql between 을 활용해서

계층형 트리 구조를 만들수 있는 것을 알게 되었습니다.

between 은 " 필드 between min and max " 으로만 알고 있었는데 group by 와 만나면 mysql 로

계층형 트리 구조를 구현할 수 있게 되더군요.

 

 

 

---- 테이블 구조

CREATE TABLE nested_category (
        category_id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        lft INT NOT NULL,
        rgt INT NOT NULL
);

 

INSERT INTO nested_category VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4),
 (4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13),
 (9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18);

 

 

---- 출력

 

SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name ) AS name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name, node.lft /* < 이 부분이 중요 네임이 중복 시 하위 출력이 안됨 */
ORDER BY node.lft

 

 

---- 하위 추가

LOCK TABLE nested_category WRITE;

SELECT @myRight := rgt FROM nested_category
WHERE category_id = ;

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2);

UNLOCK TABLES;

 

 

---- 자식 추가

 

LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft FROM nested_category

WHERE category_id = ;

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft;

INSERT INTO nested_category(name, lft, rgt) VALUES('FRS 22', @myLeft + 1, @myLeft + 2);

UNLOCK TABLES;

 

 

---- 노드 삭제

 

LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM nested_category
WHERE category_id = ;

DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;

UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight;

UNLOCK TABLES;

 

 

 

위 기능을 서핑을 통해서 찾아 봤습니다. 유용할것 같아서 가져와 봤습니다.

위 기능으로 계층형 무한 복사, 이동, 추가 가 가능할 것 같습니다.

5천개의 트리가 있을때 select 가 느릴것 같은데, 속도면에서는 어떨지 모르겠네요.

 

 

소스 출처 : https://hmjkor.tistory.com/472

 

|

댓글 2개

이진트리를 처음부터 저장하는 모델이네요 읽기 빠릅니다
2023-06-12 (월) 12:38:20
@티프 답변 감사합니다^^
댓글을 작성하시려면 로그인이 필요합니다.

개발자팁

5,403건

개발과 관련된 유용한 정보를 공유하세요. 질문은 QA에서 해주시기 바랍니다.

+
분류 제목 글쓴이 날짜 조회
OS 23-03-13 조회 1,570
웹서버 23-03-13 조회 1,686
웹서버 23-03-13 조회 1,824
PHP 23-03-13 조회 1,633
PHP 23-03-13 조회 1,656
PHP 23-03-13 조회 1,667
PHP 23-03-13 조회 1,613
PHP 23-02-23 조회 1,625
JavaScript 23-02-23 조회 1,672
PHP 23-02-23 조회 2,529
웹서버 23-02-23 조회 1,614
PHP 23-02-23 조회 1,768
PHP 23-02-21 조회 1,620
node.js 23-02-15 조회 2,102
OS 23-02-10 조회 2,316
웹서버 23-02-08 조회 1,663
PHP 23-02-07 조회 7,978
JavaScript 23-01-31 조회 2,499
PHP 23-01-26 조회 1,680
PHP 23-01-03 조회 2,328
JavaScript 23-01-02 조회 1,572
PHP 23-01-02 조회 1,678
웹서버 22-12-14 조회 3,316
기타 22-11-29 조회 2,324
JavaScript 22-11-24 조회 1,982
PHP 22-11-07 조회 2,304
MySQL 22-11-01 조회 2,482
PHP 22-10-31 조회 2,755
PHP 22-10-16 조회 2,802
JavaScript
[JavaScript]
22-10-04 조회 1,849