c语言手写平衡二叉树非递归实现

本文介绍如何在C语言中非递归地实现平衡二叉树,避免了递归导致的栈溢出问题。通过模拟栈的先进后出原则来处理数据插入和平衡调节。
摘要由CSDN通过智能技术生成

有了递归实现为啥还要用非递归呢?你会不会有疑惑?如果有,请接着看。

函数的调用需要用到栈,一个应用分配到的栈空间一般为1M大小,在数据很大的情况会造成栈溢出,所以要少用递归。

不用递归实现的原理是模拟栈的运行机制------先进后出,如果这个不会的话,可以看我写的数组模拟栈(现在还没写)。

头文件

#ifdef __cplusplus
extern "C" {
   
#endif

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//bool
#include <stdbool.h>
//字节封装的模拟栈
#include "SeqStack.h"
/* 
*自定义结构体必须包含BiNode结构体,且位于结构体最上方
*struct Person
*{

* struct BiNode data;

* int age;
  };
  *增加必须提供返回值int型的比较函数,参数为(void* ,void*),函数内强转自己定义的结构体
  *int init(void* d1, void* d2)
  *{

* struct Person* p1 = (struct Person*)d1;

* struct Person* p2 = (struct Person*)d2;

* int tmp = (p1->age) - (p2->age);

* return tmp;
  *}
  *遍历需要提供遍历函数,参数为void*,函数内强转自己定义的结构体
  *void myprint(void* node)
  *{

* if (NULL == node)

* {

* return;

* }

* struct Person* p = (struct Person*)node;

* 

* myprint(p->data.lchild);
  *
  *printf("%c\n", p->age);
  *

* myprint(p->data.rchild);
  *}
  *
  */
  //定义结构体
  struct BiNode {
   
  //父节点用于删除
  	struct BiNode* parent;
  	struct BiNode* rchild;
  	struct BiNode* lchild;
  	//用于遍历
  	bool flag;
  };

  //初始化树,外部调用
  void* Init_BBTree();
  //插入根数据,外部调用
  void Insert_BBTree(void* tree,void *data,int(*compare)(void *,void *));
  //返回树高度,内部使用
  int getHight(struct BiNode* node);
  //左旋,内部使用
  struct BiNode* LeftHand(struct BiNode* data);
  //右旋,内部使用
  struct BiNode* RightHand(struct BiNode* data);
  //平衡树节点,内部使用
  struct BiNode* AdjTree(struct BiNode* data);
  //遍历二叉树
  void foreachTree(void* tree, void(*myprint)(void*));
  //删除节点,外部使用
  void RemoveTree(void* tree, void* data,int(*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值