有了递归实现为啥还要用非递归呢?你会不会有疑惑?如果有,请接着看。
函数的调用需要用到栈,一个应用分配到的栈空间一般为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(*