用C语言的递归写个二叉搜索树(二叉排序树)

不会递归的程序员不是好程序员,虽然鄙人尚未毕业,是个无知的大学生。但这追去真理的上进心不可小量。 二叉树的每一个节点,与其左右子树都可以组成一个二叉树,利用这思路,可以写个递归形式的二叉树。

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}

这篇博客不求点赞,只是随笔(强烈暗示)

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

JAVA递归实现线索化二叉树

JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid