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,'\0',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,'\0',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,'\0',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\n");
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. ************************\n");
fir_show(root);
printf("\n");

printf("2.midddle show ************************\n");
mid_show(root);
printf("\n");

printf("3.stact_show ************************\n");
linkstack * ls = create();
stact_show(ls,root);
printf("\n");
return 0;
}

转载于:https://www.cnblogs.com/huiji12321/p/11262880.html

step3 . day7数据结构之二叉顺序数的创建和二叉树的栈形式遍历相关推荐

  1. 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树

    概念~ 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree), ...

  2. 数据结构之二叉搜索树(BST)

    数据结构之二叉搜索树(BST) 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: ( ...

  3. js遍历树节点下的所有子节点_「Javascript数据结构」× 二叉搜索树

    目录 树的相关术语 二叉树和二叉搜索树 二叉树的遍历 二叉搜索树的搜索 二叉搜索树的移除 「 树的相关术语 」 一个树结构包含一些列存在父子关系的节点.每个节点都有一个父节点(除了顶部的第一个节点)以 ...

  4. 【数据结构】二叉搜索树的python实现

    [数据结构]二叉搜索树的python实现 二叉搜索树是以二叉树来组织的,对于一个二叉搜索树的节点,其左子树节点的元素值都不大于该节点元素值,其右子树节点的元素值都不小于该节点的元素值. 首先定义一个初 ...

  5. 请回答数据结构【二叉搜索树】

    请回答数据结构[二叉搜索树] 1. BinarySearchTree(二叉排序树) 1.0 Intro 1.1 concept 2. 二叉搜索树快速入门 2.1 查找 2.2 BSTree应用 3. ...

  6. 二叉树的最近公共祖先、二叉搜索数的最近公共祖先

    目录 二叉树的最近公共祖先 二叉搜索数的最近公共祖先 二叉树的最近公共祖先Ⅱ 二叉树的最近公共祖先Ⅲ 二叉树的最近公共祖先Ⅳ 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖 ...

  7. 【Python数据结构】——二叉平衡树AVL(查找、构建、删除、插入、打印、遍历)

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/7/28 20:57 # @Author : @linlianqin # @S ...

  8. 【数据结构】二叉搜索树

    1.什么是二叉搜索树 二叉搜索树又称为二叉排序树,二叉也就说明它跟二叉树一样最多只能有两个度,它可以是棵空树,也可以不是棵空树,当它不是棵空树的时候需要具备以下的性质: 若它的左树不为空,那么它的左树 ...

  9. 二叉树OJ(一)二叉树的最大深度 二叉搜索树与双向链表 对称的二叉树

    二叉树的最大深度 二叉树中和为某一值的路径(一) 二叉搜索树与双向链表 对称的二叉树 二叉树的最大深度 描述 求给定二叉树的最大深度, 深度是指树的根节点到任一叶子节点路径上节点的数量. 最大深度是所 ...

最新文章

  1. congratulation的用法_congratulation的用法
  2. 大型AI已有自主意识了?LeCun开喷Open AI首席科学家
  3. 离开百度三年多,吴恩达纽交所敲钟,身价再增20亿
  4. JavaScript [ 转 ] —— 面向对象编程(三):非构造函数的继承
  5. Spring Cloud【Finchley】实战-06使用/actuator/bus-refresh端点手动刷新配置 + 使用Spring Cloud Bus自动更新配置
  6. python中的apply(),applymap(),map() 的用法和区别
  7. Struts2整合SiteMesh
  8. office2007右键doc,xls
  9. c语言共享内存储存结构体,C语言共享内存使用思路利用结构体
  10. 技术公开课:SQL Server 高可用性解决方案概述(下)
  11. C#实现动态桌面背景图片切换(续)
  12. shell 创建文件_vba代替鼠标打开文件夹
  13. class文件反编译后的汉字乱码问题
  14. 7z解压软件(小巧好用)。百度云下载链接
  15. matlab绘制vti群速度,VTI介质中P波相速度与群速度的比较
  16. 闪存驱动器_什么是闪存驱动器?
  17. VSLAM之边缘化 Marginalization 和 FEJ (First Estimated Jocobian)
  18. 如何做拉新活动?拉新裂变的12种玩法,你学废了没?
  19. 【它来了】搭载龙芯3A4000的国产办公电脑-桌面型机箱来了~
  20. 国产操作系统突破重围,中兴新支点系统宣布:30万+,并发布服务器模式

热门文章

  1. Html点击按钮时 修改某个标签的 click点击事件
  2. Qt--qss(暗橙色)
  3. 2020-09-11
  4. 关于hibernate的关联外键生成以及外键属性列的正确插入即:解决外键插入时,在关联表中除了外键列为空,其它属性均正常级联保存
  5. Understanding Quaternions 中文翻译《理解四元数》
  6. 机器学习物语(3):回归问题
  7. C/C++堆、栈及静态数据区详解
  8. 为什么UDP有时比TCP更有优势?
  9. 实现strcmp库函数的功能
  10. ubuntu切换python,以及切换python后相关包的管理