스윙 트리 검색에 관한 질문입니다..

sadrove의 이미지

우선 트리의 구조가 아래와 같을때요..

Quote:

A
|----B
| |---C
|
|----D
| |----E

(표현이 이상하게 되네요..A의 하위노드가 B,D 이고, B노드의 하위노드가 C이고, D의 하위노드가 E입니다.)

제가 구현하려는 건..
사용자가 A를 클릭했을 때 B가 있으면 C를 저장하고, 다시 D가 있으면 E를 저장하려는건데요..
아래와 같이 코드를 작성했습니다..
여기서 C는 제대로 저장이 되는데 E는 저장이 되질 않습니다..
그냥 생각해봐도 안되는게 당연한 것 같은데요..
아래 코드에서 5번째줄에서 노드 A로 변경하고..
7번째줄에서 다음 노드를 검색하면 바로 B를 다시 검색하게 됩니다..
제가 원하는 건 D를 검색하길 바라는데 말이죠...
뭔가 뾰족한 수가 떠오르지 않네요...
코드가 상당히 비효율적인 듯 하기도 하고요...^^;;
조언 부탁드립니다...

1: if((String)node.getUserObject() == "A"){
2: 	if((String)node.getNextNode().getUserObject() == "B"){
3: 		node = node.getNextNode();				//노드를 B로 이동
4: 		temp[0] = (String)node.getNextNode().getUserObject();	// C를 배열에 저장
5: 		node = node.getPreviousNode();		//노드를 A로 변경
6: 	}
7: 	if((String)node.getNextNode().getUserObject() == "D"){
8:		node = node.getNextNode();
9:		temp[1] = (String)node.getNextNode().getUserObject();	//E를 배열에 저장
10:		node = node.getPreviousNode();
11:	}
12: }
sadrove의 이미지

답변이 없어서..다시 간략화 시킵니다..
제가 설명을 잘 못해서..^^;;
즉, 아래와 같이 하고 싶은겁니다..

A노드의 하위노드에 B,C노드가 있을 때

if((String)node.getUserObject() == "A"){
	//첫번째 if
	if((String)node.getNextNode().getUserObject() == "B"){
		node = node.getNextNode();		
		// 어떤 작업
		node = node.getPreviousNode();
	}
	
	//두번째 if
	//여기서 C를 검색하게 하고 싶은데..
	//실제로는 B를 다시 검색함
	if((String)node.getNextNode().getUserObject() == "C"){
		node = node.getNextNode();		
		// 어떤 작업
		node = node.getPreviousNode();
	}
}

주석부분에 보면, 첫번째 if문에서 다시 A노드로 돌아온 다음..
두번째 if문에서 C노드가 있는지를 검사하고 싶은데..
실제로는 B노드가 먼저 있기 때문에 B노드만 검색한다는 겁니다..
어찌 해결해야할지...막막하네요..ㅠ.ㅠ...
도움 부탁드립니다...

지리즈의 이미지

노드에 depth는 없습니까?

parent, child, left, right개념이 있다면...
depth도 필요없을 것 같은데요.
B트리에는 있지 않나요?

There is no spoon. Neo from the Matrix 1999.

fender의 이미지

비즈니스 로직을 몰라서 정확히 답변은 못드리겠지만, 원하시는게 leaf node를 찾아 어떤 작업을 하는 것이라면, 그냥 노드 클래스에 자신이 leaf이면 저장하고 아니면 하위 노드를 찾아 재귀적으로 동일한 메소드를 호출하게 하면 if문 없이 끝날 것 같네요...

----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...

sadrove의 이미지

fender wrote:
비즈니스 로직을 몰라서 정확히 답변은 못드리겠지만, 원하시는게 leaf node를 찾아 어떤 작업을 하는 것이라면, 그냥 노드 클래스에 자신이 leaf이면 저장하고 아니면 하위 노드를 찾아 재귀적으로 동일한 메소드를 호출하게 하면 if문 없이 끝날 것 같네요...

자신이 leaf node이면 저장하는 것은 맞습니다만..
자신의 부모노드에 따라서 자신이 배열에 저장되는 위치가 달라져야합니다.
즉,
자신의 부모가 A라는 이름이라면 temp[0]에 저장되어야하고..
자신의 부모가 B라는 이름이라면 temp[1]에 저장되어야 합니다...
쉽지가 않네요...에고...

fender의 이미지

sadrove wrote:
fender wrote:
비즈니스 로직을 몰라서 정확히 답변은 못드리겠지만, 원하시는게 leaf node를 찾아 어떤 작업을 하는 것이라면, 그냥 노드 클래스에 자신이 leaf이면 저장하고 아니면 하위 노드를 찾아 재귀적으로 동일한 메소드를 호출하게 하면 if문 없이 끝날 것 같네요...

자신이 leaf node이면 저장하는 것은 맞습니다만..
자신의 부모노드에 따라서 자신이 배열에 저장되는 위치가 달라져야합니다.
즉,
자신의 부모가 A라는 이름이라면 temp[0]에 저장되어야하고..
자신의 부모가 B라는 이름이라면 temp[1]에 저장되어야 합니다...
쉽지가 않네요...에고...


정확하게 구현 하시려는 내용을 설명해 주실 수 있나요? 뭔가 아주 특이한 경우가 아니라면 저렇게 조건문으로 노드를 확인해서 처리하는 건 잘못된 설계 같습니다.

----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...

sadrove의 이미지

항상 질문에 관심 가져주셔서 감사합니다...^^
삽질끝에..어느정도 해결이 되었네요...
좋은 밤 되세요...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.