데이터 구조 기초 지식의 두 갈래 찾기 트 리
                                            
 22121 단어  두 갈래 찾기 트 리
                    
이 진 트 리 찾기: 모든 노드 가 조건 을 만족 시 키 고 노드 의 key 값 은 모든 왼쪽 트 리 노드 의 key 값 보다 크 며 모든 오른쪽 트 리 노드 의 key 값 보다 작 습 니 다.
삽입: 현재 노드 p - > key, 삽입 할 key 값 과 비교, p - > key < key, 우회전;그렇지 않 으 면 좌회전.
삭제: 노드 x 를 삭제 하면 x 에 아이 가 없 으 면 바로 삭제 합 니 다.만약 x 에 아이 가 하나 밖 에 없다 면 x 의 아버 지 는 x 의 아 이 를 가리 키 고 x 를 삭제 합 니 다.만약 에 x 에 두 명의 아이 가 있다 면 x 의 중간 순서 후계 y 를 찾 으 면 y 는 반드시 한 명의 아이 만 있 을 것 이다. y 값 을 x 에 부여 하고 마지막 에 y 를 삭제 할 것 이다.
  1 #include <stdio.h>
  2 #include <math.h>
  3 #include <queue>
  4 typedef struct node
  5 {
  6     int key;
  7     struct node *left;
  8     struct node *right;
  9 }treeNode;
 10 
 11 //tree    
 12 treeNode* minimum(treeNode *x)
 13 {
 14     while(x->left)
 15         x = x->left;
 16     return x;
 17 }
 18 
 19 //tree    
 20 treeNode* maximum(treeNode *x)
 21 {
 22     while(x->right)
 23         x = x->right;
 24     return x;
 25 }
 26 //  x    
 27 //1.x    ,        
 28 //2.x     ,   x     y,   y      x   
 29 treeNode* tree_successor(treeNode *root, int value)
 30 {
 31     treeNode *p = root;
 32     treeNode *parent = NULL;
 33     while (p && p->key!=value)
 34     {
 35         if(p->key < value)
 36             p = p->right;
 37         else
 38         {
 39             parent = p;
 40             p = p->left;
 41         }
 42     }
 43     //    value 
 44     if (p == NULL)
 45     {
 46         return NULL;
 47     }
 48     if (p->right != NULL)
 49     {
 50         return minimum(p->right);
 51     }
 52     //  parent NULL,  x       
 53     return parent;
 54 
 55 }
 56 
 57 treeNode* insert(treeNode *root, int value)
 58 {
 59     treeNode *newNode = new node;
 60     newNode->key = value;
 61     newNode->left = NULL;
 62     newNode->right = NULL;
 63     if(root == NULL)
 64     {
 65         return newNode;
 66     }
 67     treeNode *cur = root;
 68     treeNode *p;
 69     while(cur != NULL)
 70     {
 71         p = cur;
 72         if(cur->key < value)
 73             cur = cur->right;
 74         else cur = cur->left;
 75     }
 76     if(p->key < value)
 77         p->right = newNode;
 78     else p->left = newNode;
 79 
 80     return root;
 81 }
 82 //    x
 83 //x    ,     
 84 //x      ,x     x   
 85 //x     ,x     y, y         x.key <- y.key    y
 86 void erase(treeNode *root, int value)
 87 {
 88     treeNode *x = root;
 89     treeNode *parent = root;
 90     while(x != NULL)
 91     {
 92         parent = x;
 93         if(x->key < value)
 94             x = x->right;
 95         else if (x->key > value)
 96             x = x->left;
 97         else break;
 98     }
 99     //    value 
100     if(x == NULL)
101         return;
102     treeNode *child;
103     child = (x->left == NULL) ? x->right : x->left;
104     //            
105     if(x->left==NULL || x->right==NULL)
106     {
107         if (parent->left == x)
108             parent->left = child;
109         else parent->right = child;
110         delete x;
111         return;
112     }
113     //x     
114     parent = x;
115     treeNode *y = x->right;
116     while(y->left)
117     {
118         parent = y;
119         y = y->left;
120     }
121     x->key = y->key;
122     //  y
123     if(parent->left == y)
124         parent->left = y->right;
125     else
126         parent->right = y->right;
127     delete y;
128 }
129 
130 void midOrder(treeNode *root)
131 {
132     if(root != NULL)
133     {
134         midOrder(root->left);
135         printf("%d ", root->key);
136         midOrder(root->right);
137     }
138 }
139 
140 void preOrder(treeNode *root)
141 {
142     if(root != NULL)
143     {
144         printf("%d ", root->key);
145         preOrder(root->left);
146         preOrder(root->right);
147     }
148 }
149 
150 int depth(treeNode *root)
151 {
152     if(root == NULL) return 0;
153     
154     int left = depth(root->left);
155     int right = depth(root->right);
156     return ((left > right) ? left+1 : right+1);
157     
158 }    
159 
160 int main()
161 {
162     printf("           -1    
");
163     int a, h;
164     treeNode *root = NULL;
165     while(scanf("%d", &a), a != -1)
166     {
167         root = insert(root, a);
168     }
169     printf("    
");
170     midOrder(root);
171     printf("
    
");
172     preOrder(root);
173     printf("
      key 
");
174     scanf("%d", &a);
175     erase(root, a);
176     printf("    
");
177     midOrder(root);
178     printf("
    
");
179     preOrder(root);
180 
181     system("pause");
182     return 0;
183 }이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
POJ 1442 밸 런 스 트 리 Treap클릭 하여 링크 열기 제목: m 개 수 를 입력 하고 n 개 수 를 묻 습 니 다. 첫 번 째 수 는 3 이면 m 의 세 번 째 수 를 입력 한 후 1 번 째 로 큰 수 를 출력 하고 두 번 째 는 두 번 째 로 큰...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.