데이터 구조 빠 른 회고 - 이 진 트 리
13917 단어 데이터 구조
기본 개념:
(1) 결점 의 도.결점 이 가지 고 있 는 하위 나무의 개 수 를 이 결점 의 도 라 고 한다.
(2) 엽 결점.도 0 의 결점 을 엽 결점 이 라 고 부 르 거나 단말기 결점 이 라 고 부른다.
(3) 분지 결점.도 0 이 아 닌 결점 을 분기 결점 이 라 고 부 르 거나 비 단말기 결점 이 라 고 부른다.한 그루 나무의 결점 은 잎의 결점 을 제외 하고 나머지 는 모두 지점 이다.
(4) 왼쪽 아이, 오른쪽 아이, 부모.나무 에 있 는 결점 이 있 는 나무의 뿌리 결점 을 이 결점 의 아이 라 고 부른다.이 결점 을 아이의 결점 이 라 고 부 르 는 양친.같은 부 모 를 가 진 아이의 결점 을 서로 형제 라 고 부른다.
(5) 경로, 경로 길이.만약 에 한 나무의 한 줄 의 결점 n1, n2,..., nk 는 다음 과 같은 관계 가 있다. 결점 ni 는 Ni + 1 의 아버지 결점 (1 ≤ i < k) 이 고 n1, n2,..., nk 를 n1 에서 nk 까지 의 경로 라 고 부른다.이 경로 의 길 이 는 k - 1 입 니 다.
(6) 조상, 자손.나무 에서 결점 M 에서 결점 N 까지 의 경로 가 있다 면 M 은 N 의 조상 이 라 고 부 르 고 N 은 M 의 자손 이 라 고 부른다.
(7) 결점 의 층수.나무의 뿌리 결산 점 을 규정 하 는 층 수 는 1 이 고, 나머지 결산 점 의 층 수 는 그의 부모 결산 점 의 층수 에 1 을 더 하 는 것 과 같다.
(8) 나무의 깊이.나무의 모든 결점 의 최대 층 수 를 나무의 깊이 라 고 한다.
(9) 나무의 도.나무의 각 결점 도의 최대 치 를 이 나무의 도 라 고 한다.
(10) 이 진 트 리 가 가득 합 니 다. 이 진 트 리 에 모든 가지 결점 이 왼쪽 나무 와 오른쪽 나무 가 존재 하고 모든 잎 결점 이 같은 층 에 있 습 니 다. 이런 이 진 트 리 를 이 진 트 리 라 고 합 니 다.
다음은 이 진 트 리 의 노드 구 조 를 보 여 줍 니 다.
1 //
2
3 typedef struct BinaryTreeNode 4 { 5 int m_nValue; 6 BinaryTreeNode *m_pLeft; 7 BinaryTreeNode *m_pRight; 8
9 }node;
이 진 트 리 의 기본 동작: 노드 개수 계산, 트 리 깊이 계산, 앞 순서 옮 겨 다 니 기, 중간 순서 옮 겨 다 니 기, 뒤 순서 옮 겨 다 니 기 및 넓 은 검색
그 중에서 앞 순 서 는 재 귀 대신 스 택 을 사용 하 는 실현 방법 을 보 여 주 었 다.
1 //
2
3 int getNodeNum(node *pRoot) 4 { 5 if(pRoot == NULL) 6 return 0; 7 return getNodeNum(pRoot->m_pLeft)+getNodeNum(pRoot->m_pRight)+1; 8 } 9
10
11 //
12 int getDepth(node *pRoot) 13 { 14 if(pRoot == NULL) 15 return 0; 16 int depthLeft = getDepth(pRoot->m_pLeft); 17 int depthRight = getDepth(pRoot->m_pRight); 18
19 return depthLeft>depthRight ? (depthLeft+1) :(depthRight+1); 20
21 } 22
23 //
24 /* : 25 (1) , 26 (2) , , , 27 : 28 */
29 void PreOrderTraverse(node *pRoot) 30 { 31 if(pRoot == NULL) 32 return; 33 Visit(pRoot); 34 PreOrderTraverse(pRoot->m_pLeft); 35 PreOrderTraverse(pRoot->m_pRight); 36 } 37 //
38 void PreOrderTraverse(node *pRoot) 39 { 40 InitStack(S); 41 while(!StackEmpty(S)) 42 { 43 node *p = new node(); 44 //
45 while(GetTop(S,p)&& p) 46 Push(p->m_pLeft); 47 Pop(S,p);//
48 if(!StackEmpty(S)) 49 { 50 Pop(S,p); 51 if(!Visit(p->data)) 52 return 0;//
53 Push(S,p->m_pRight); 54 } 55 } 56 } 57
58 //
59
60 void InOrderTraverse(node *pRoot) 61 { 62 if(pRoot == NULL) 63 return; 64 InOrderTraverse(pRoot->m_pLeft); 65 Visit(pRoot); 66 InOrderTraverse(pRoot->m_pRight); 67 } 68
69 //
70 void PostOrderTraverse(node *pRoot) 71 { 72 if(pRoot == NULL) 73 return; 74
75 PostOrderTraverse(pRoot->m_pLeft); 76 PostOrderTraverse(pRoot->m_pRight); 77 Visit(pRoot); 78 } 79
80 //
81 /*
82 , 。 , : , , , 。 83 */
84 void LevelTraverse(node *pRoot) 85 { 86 if(pRoot == NULL) 87 return; 88
89 quene<node *> q; 90 q.push(pRoot); 91
92 while(!q.empty()) 93 { 94 node *pNode = q.front(); 95 q.pop(); 96
97 Visit(pNode); 98 if(pNode->m_pLeft != NULL) 99 q.push(pNode->m_pRight); 100 if(pNode->m_pRight != NULL) 101 q.push(pNode->m_pRight); 102 } 103 return; 104 }
참고:http://www.cztvu.ah163.net/czcai/soft/kj/sjjg/jj/ch6.htm
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.