Tree의 레벨 구하기~

espoirgod의 이미지

typedef struct BinarySearchTree {
	int key;
	struct BinarySearchTree *left;
	struct BinarySearchTree *right;
} T;

void getlevel(T *tree, int level)
{
	if (tree) {
		level++;

		getlevel(tree->left, level);
		getlevel(tree->right, level);
		
                                // treedepth 는 전역 변수입니다
		if (treedepth < level)
			treedepth = level;
	}
}

여러분들은 링크드 리스트로 구현한 트리의 레벨을
어떻게 구하시나요?

이 소스 간단해서 좋기는 한데..
별로 마음에 안 들어서요;;

정태영의 이미지

자주 쓰일만한 것이라면 트리의 depth 정도를 기억하는 것도 나쁘진 않을 듯 합니다 ;)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

doldori의 이미지

이 정도면 어떨까요? 전역 변수는 안씁니다.

int getLevel(T* tree)
{
    if (tree == NULL) return 0;

    int lLevel = getLevel(tree->left);
    int rLevel = getLevel(tree->right);

    if (lLevel > rLevel) return lLevel + 1;
    else return rLevel + 1;
}
tristansong의 이미지

doldori wrote:
이 정도면 어떨까요? 전역 변수는 안씁니다.
int getLevel(T* tree)
{
    if (tree == NULL) return 0;

    int lLevel = getLevel(tree->left);
    int rLevel = getLevel(tree->right);

    if (lLevel > rLevel) return lLevel + 1;
    else return rLevel + 1;
}

되돌이를 쓰지 않는 건 어떻습니까?
hyperhidrosis의 이미지

↑ 어떻게 할수 있죠? 쉽지않을것 같은데요?

정태영의 이미지

hyperhidrosis wrote:
↑ 어떻게 할수 있죠? 쉽지않을것 같은데요?

스택 하나만 있으면 됩니다 ;)

typedef struct {
   nodeptr node;
   int level;
} stack;

stack stack_data[MAX_NODE];
int top;

정도로 하고...

우선 stack 에... tree의 최상위 노드를 집어넣은 후....

stack 이 비어있으면 종료
비어있지 않으면 pop
노드의 자식노드들과 현재레벨을 stack 에 push

를 반복하면 되겠죠 ;)

c calling convension 보다 stack연산이 가볍다면... 더 빨라지기는 합니다...

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

vacancy의 이미지

이럴 때는 특별한 사유가 없다면 doldori님처럼 recursive 하게 하는 편이
이해하기도 쉽고 문제를 발생시킬 소지도 적다고 봅니다.
Fibonacci 처럼 중복된 노드 방문이 있는 것도 아니고요.

정태영님께서 제시하신 것처럼 별도의 스택을 사용하거나,
비슷한 방법을 쓰되 큐를 써서 BFS를 사용하는 방법도 있겠습니다만
이 경우엔 어차피 DFS로 하나 BFS로 하나 노드 방문수에 차이가 없어서
구현이 쉬운 쪽이 낫지 않나 생각이 드네요.
속도도 DFS 쪽이 웬만하면 더 빠를 것 같고요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.