1。最近从网易云课堂学习了一个老师的数据结构相关的知识,了解到数据结构的应用和二分查找之间的关系,就自己想着写一个创建二叉顺序数和利用栈对二叉顺序树进行顺序输出的代码,终于一个周末的时间写完了。
2.写代码的重点在于实现逻辑,由于递归思想和逻辑的混乱,代码容易出现段错误或者,偶尔输出一半的结果,梳理了好久,结合前序、中序输出推导出树的结构,从而寻找代码问题的形式,终于搞定了
3.因此代码思想远比代码实现更重要,而代码的思想又需要扎实的基本功,继续努力。。。,
4.添加:二叉排序树的查找,利用比较大小,判断是在左右子树位置,从而判断有无
删除:查找删除位置,如果是叶子节点,修改其根节点的孩子指针,如果是根节点,将其左子树最大、或者右子树最小替换到该位置,删除替换元素
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _node{
int date;
struct _node * lchild;
struct _node * rchild;
struct _node * parent;
}btreenode;
void btreenode_add(btreenode * root,btreenode * temp){
btreenode *temproot = root; //根节点临时变量
if(temp->date > temproot->date){ //对比节点数据域
if(temproot->rchild != NULL){ //寻找插入点
temproot = temproot->rchild;
btreenode_add(temproot,temp); //插入点不为空,递归调用
}
else
temproot->rchild = temp;
}
else{
if(temproot->lchild != NULL){
temproot = temproot->lchild;
btreenode_add(temproot,temp);
}
else
temproot->lchild = temp;
}
}
//二叉顺序树的创建
btreenode * btreenode_creat(int num){
if(num <= 0) return NULL; //创建节点数小于0退出
srand(time(NULL)); //随机数函数,创建头节点并初始化
btreenode * root = (btreenode *)malloc(sizeof(btreenode));
memset(root,' ',sizeof(root));
root->date = rand()%100+1;
root->lchild = root->rchild = root->parent = NULL;
int i;
for(i=2;i<=num;i++){ //依次添加节点
btreenode * temp = (btreenode *)malloc(sizeof(btreenode));
memset(temp,' ',sizeof(temp));
temp->date = (rand()%100+1);
btreenode_add(root,temp);//调用添加节点函数
}
return root; //返回根节点
}
//二叉树的中序遍历
void mid_show(btreenode * root){
if(root->lchild != NULL)
mid_show(root->lchild);
printf("%d ",root->date);
if(root->rchild != NULL)
mid_show(root->rchild);
}
//二叉树的先序遍历
void fir_show(btreenode * root){
printf("%d ",root->date);
if(root->lchild != NULL)
fir_show(root->lchild);
if(root->rchild != NULL)
fir_show(root->rchild);
}
typedef struct _linkstack{ //栈结构体
btreenode * node;
struct _linkstack *next;
}linkstack;
linkstack * create(){
linkstack * ls = (linkstack *)malloc(sizeof(linkstack));
memset(ls,' ',sizeof(ls));
ls->next = NULL;
ls->node = NULL;
return ls;
}
int is_empty(linkstack * ls){
return ls->next ==NULL ? 1 : 0;
}
void push(linkstack * ls,btreenode *node){
linkstack * temp = create();
temp->node = node;
linkstack * lstemp = ls;
while(lstemp->next != NULL){ lstemp = lstemp->next;}
lstemp->next = temp;
}
linkstack * pop(linkstack * ls){
if(is_empty(ls)){
printf("stact_is_empty
");
return NULL;
}
linkstack *temp,*p,*q;
temp = ls;
while(temp->next->next != NULL) temp =temp->next;
p = temp;
q = p->next;
p->next = NULL;
return q;
}
//二叉树使用栈实现中序输出
void stact_show(linkstack * ls,btreenode * root){
btreenode * temp = root;
push(ls,temp); //根节点压栈
while(temp->lchild != NULL){ //左孩子不为空压栈
temp = temp->lchild;
push(ls,temp);
}
while( !(is_empty(ls))){//栈非空出站
temp = pop(ls)->node;
printf("%d ",temp->date);
if(temp->rchild !=NULL) //出站节点有右孩子,递归调用自身压栈出栈
stact_show(ls,temp->rchild);
}
}
int main(int argc, const char *argv[])
{
btreenode * root = btreenode_creat(10);
printf("1first show. ************************
");
fir_show(root);
printf("
");
printf("2.midddle show ************************
");
mid_show(root);
printf("
");
printf("3.stact_show ************************
");
linkstack * ls = create();
stact_show(ls,root);
printf("
");
return 0;
}