不会递归的程序员不是好程序员,虽然鄙人尚未毕业,是个无知的大学生。但这追去真理的上进心不可小量。 二叉树的每一个节点,与其左右子树都可以组成一个二叉树,利用这思路,可以写个递归形式的二叉树。
1#include<stdio.h> 2#include<stdlib.h> 3 4typedef struct treeNode 5{ 6 int data; 7 struct treeNode* LeftChild; 8 struct treeNode* RightChild; 9}*LPBST,*LPNode,Node; 10 11//createNode这个函数可以自己画个图练习一下 12//每一个指针都由指针域和数据域构成 13LPNode createNode(int data) 14{ 15 LPNode newNode = (LPNode)malloc(sizeof(Node)); 16 if (newNode != NULL) 17 { 18 newNode->data = data; 19 newNode->LeftChild = NULL; 20 newNode->RightChild = NULL; 21 } 22 return newNode; 23} 24 25LPBST InsertNode(LPBST tree, int data) 26{ 27 if (tree == NULL) 28 { 29 //如果树为空,则创建二叉树 30 tree = createNode(data); 31 } 32 else 33 { 34 if (tree->data > data) 35 { 36 //对比插入的数据和该节点的数据, 37 //若小于节点数据则进入左子树,大于则进入右子树,并调用自身函数 38 //如此递归下去 39 tree->LeftChild = InsertNode(tree->LeftChild, data); 40 } 41 else if (tree->data < data) 42 { 43 tree->RightChild = InsertNode(tree->RightChild, data); 44 } 45 } 46 return tree; 47} 48 49LPNode SearchNode(LPBST tree, int data) 50{ 51 if (tree == NULL) 52 { 53 return NULL; 54 } 55 else 56 { 57 //对比搜索的数据和该节点的数据, 58 //若小于节点数据则进入左子树,大于则进入右子树,并调用自身函数 59 //如此递归下去 60 if (tree->data > data) 61 { 62 return SearchNode(tree->LeftChild, data); 63 } 64 else if(tree->data < data) 65 { 66 return SearchNode(tree->RightChild, data); 67 } 68 else 69 { 70 return tree; 71 } 72 } 73} 74 75LPNode FindMin(LPBST tree) 76{ 77 if (tree == NULL) 78 { 79 return NULL; 80 } 81 else 82 { 83 //左子树为空 ,则该数据是最小数据。 84 if (tree->LeftChild == NULL) 85 { 86 return tree; 87 } 88 else 89 { 90 //左子树不为空,则继续进入左子树查找 91 return FindMin(tree->LeftChild); 92 } 93 } 94} 95 96LPNode FindMax(LPBST tree) 97{ 98 if (tree == NULL) 99 { 100 return NULL; 101 } 102 else 103 { 104 //与FindMin函数的道理相反 105 if (tree->RightChild == NULL) 106 { 107 return tree; 108 } 109 else 110 { 111 return FindMax(tree->RightChild); 112 } 113 } 114} 115 116void MidOrderTralersal(LPBST tree) 117{ 118 if (tree != NULL) 119 { 120 MidOrderTralersal(tree->LeftChild); 121 printf("%d\t", tree->data); 122 MidOrderTralersal(tree->RightChild); 123 } 124} 125 126LPBST DeleteNode(LPBST tree, int data) 127{ 128 LPNode tempNode; 129 if (tree == NULL) 130 { 131 return NULL; 132 } 133 //前面的递归部分都是道理相同的,比较目标数据与节点然后进行操作 134 else if (tree->data > data) 135 { 136 tree->LeftChild = DeleteNode(tree->LeftChild, data); 137 } 138 else if (tree->data < data) 139 { 140 tree->RightChild = DeleteNode(tree->RightChild, data); 141 } 142 else 143 { 144 if (tree->LeftChild && tree->RightChild) 145 { 146 //在右子树中找到最小节点填充到被删除节点 147 tempNode = FindMin(tree->RightChild); 148 tempNode->data = tree->data; 149 //在删除的节点的右子树中删除最小元素 150 tree->RightChild = DeleteNode(tree->RightChild, tree->data); 151 } 152 else 153 { 154 tempNode = tree; 155 //有右子树或者无子节点 156 if (tree->LeftChild == NULL) 157 { 158 tree = tree->RightChild; 159 } 160 //有左子树或者无子节点 161 else if (tree->RightChild == NULL) 162 { 163 tree = tree->LeftChild; 164 } 165 free(tempNode); 166 } 167 } 168 return tree; 169} 170 171int main() 172{ 173//记着初始化变量,不管是指针变量还是普通变量 174 LPBST tree=NULL; 175 int array[8] = { 4,76,24,99,57,30,13,169 }; 176 for (int i = 0; i < 8; i++) 177 { 178 tree = InsertNode(tree, array[i]); 179 } 180 MidOrderTralersal(tree); 181 printf("\n"); 182 LPNode MinNode = FindMin(tree); 183 LPNode MaxNode = FindMax(tree); 184 LPNode positionNode = SearchNode(tree, 169); 185 printf("%d\t%d\t%d\n", MinNode->data, MaxNode->data, positionNode->data); 186 187 tree = DeleteNode(tree, 13); 188 MidOrderTralersal(tree); 189 system("pause"); 190 return 0; 191}
这篇博客不求点赞,只是随笔(强烈暗示)
