1. 程式人生 > >排序二叉樹節點的刪除

排序二叉樹節點的刪除

for 臨時 sse 刪除節點 bsp != == tro 二叉樹

全部代碼

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <assert.h>
  4 
  5 typedef struct node
  6 {
  7     int nValue;
  8     struct node *pLeft;
  9     struct node *pRight;
 10 }BiTree;
 11 
 12 void Add(BiTree **ppRoot, int nNum)
 13 {
 14     BiTree *pTemp = NULL;
15 BiTree *pNode = NULL; 16 17 assert(ppRoot!=NULL); 18 19 //臨時節點開辟空間 20 pTemp = (BiTree *)malloc(sizeof(BiTree)); 21 if(NULL == pTemp) 22 { 23 printf("pTemp空間分配失敗!\n"); 24 exit(-1); 25 } 26 pTemp->nValue = nNum; 27 pTemp->pLeft = NULL;
28 pTemp->pRight = NULL; 29 30 //空樹 31 if(NULL == *ppRoot) 32 { 33 *ppRoot = pTemp; 34 return; 35 } 36 37 pNode = *ppRoot; 38 39 //非空樹 40 while(pNode != NULL) 41 { 42 //比根大 43 if(nNum > pNode->nValue) 44 {
45 //向右走 46 if(NULL == pNode->pRight) 47 { 48 pNode->pRight = pTemp; 49 return; 50 } 51 else 52 { 53 pNode = pNode->pRight; 54 } 55 } 56 //比根小 57 else if(nNum < pNode->nValue) 58 { 59 //向左走 60 if(NULL == pNode->pLeft) 61 { 62 pNode->pLeft = pTemp; 63 return; 64 } 65 else 66 { 67 pNode = pNode->pLeft; 68 } 69 } 70 //相等 出錯 71 else 72 { 73 //釋放臨時節點空間 74 free(pTemp); 75 pTemp = NULL; 76 return; 77 } 78 } 79 } 80 81 BiTree *CreateSBT(int arr[], int len) 82 { 83 BiTree *pRoot = NULL; 84 int i; 85 86 assert(arr!=NULL && len>0); 87 88 for(i=0; i<len; ++i) 89 { 90 Add(&pRoot, arr[i]); 91 } 92 93 return pRoot; 94 } 95 96 void BiTreeTraversal(BiTree *pRoot) 97 { 98 if(NULL == pRoot) 99 { 100 return; 101 } 102 printf("%d ", pRoot->nValue); 103 BiTreeTraversal(pRoot->pLeft); 104 BiTreeTraversal(pRoot->pRight); 105 } 106 107 void FindNode(BiTree *pRoot, int nNum, BiTree **pDel, BiTree **pFather) 108 { 109 assert(pRoot!=NULL && pDel!=NULL && pFather!=NULL); 110 111 while(pRoot != NULL) 112 { 113 if(nNum == pRoot->nValue) 114 { 115 *pDel = pRoot; 116 return; 117 } 118 else if(nNum < pRoot->nValue) 119 { 120 *pFather = pRoot; 121 pRoot = pRoot->pLeft; 122 } 123 else 124 { 125 *pFather = pRoot; 126 pRoot = pRoot->pRight; 127 } 128 } 129 } 130 131 void DelNode(BiTree **ppRoot, int nNum) 132 { 133 BiTree *pDel = NULL; 134 BiTree *pMark = NULL; 135 BiTree *pFather = NULL; 136 137 assert(*ppRoot!=NULL && ppRoot!=NULL); 138 139 //查找 140 FindNode(*ppRoot, nNum, &pDel, &pFather); 141 142 //沒找到 143 if(NULL == pDel) 144 { 145 return; 146 } 147 148 //找到 149 //檢測節點情況 150 //兩個孩子 151 while(pDel->pLeft!=NULL && pDel->pRight!=NULL) 152 { 153 //找到左的最右 154 //先標記要刪除節點 155 pMark = pDel; 156 157 //向左走一步 158 pFather = pDel; 159 pDel = pDel->pLeft; 160 161 //最右 162 while(pDel->pRight != NULL) 163 { 164 pFather = pDel; 165 pDel = pDel->pRight; 166 } 167 168 //值覆蓋 169 pMark->nValue = pDel->nValue; 170 } 171 172 //一個孩子 173 //被刪除節點是根節點 174 if(NULL == pFather) 175 { 176 *ppRoot = (*ppRoot)->pLeft?(*ppRoot)->pLeft : (*ppRoot)->pRight; 177 free(pDel); 178 pDel = NULL; 179 return; 180 } 181 182 //被刪除節點是父親的左 183 if(pDel == pFather->pLeft) 184 { 185 pFather->pLeft = pDel->pLeft?pDel->pLeft : pDel->pRight; 186 } 187 //被刪除節點是父親的右 188 else 189 { 190 pFather->pRight = pDel->pRight?pDel->pRight : pDel->pLeft; 191 } 192 free(pDel); 193 pDel = NULL; 194 } 195 196 int main(void) 197 { 198 int arr[] = {1, 7, 3, 4, 5, 6, 7}; 199 int len = sizeof(arr)/sizeof(arr[0]); 200 BiTree *pRoot = CreateSBT(arr, len); 201 BiTreeTraversal(pRoot); 202 printf("\n"); 203 DelNode(&pRoot, 4); 204 BiTreeTraversal(pRoot); 205 206 return 0; 207 }

排序二叉樹節點的刪除