当前位置:   article > 正文

二叉树的创建和遍历_ch=str[index++]

ch=str[index++]

以下所写是对于二叉树的创建和遍历的几点心得总结:
1.关于exit()函数的用法:在stdlib.h的头文件中
另外存在着exit()和return()的区别理解:

  • exit()用于程序运行过程中随时结束程序(停止执行并退出程序)。
  • return()是当前函数返回,当然如果用在主函数main()里面,自然也就结束程序当前进程和exit()作用一样了,所以区别主要在运用于非主函数main()里面。
    2.OVERFLOW为math.h中的一个宏定义其值为3,含义为运算过程中出现了上溢,即运算结果超出了运算变量所能存储的范围。所以exit(OVERFLOW)的含义就是退出程序,并返回OVERFLOW的值给主调进程,其标准的使用范围为,当程序运算出现上溢时,退出程序并报错给主调进程。
    3.为什么要用指针的指针创建二叉树?
    如果只用一层指针会发现二叉树没有创建好,因为函数调用的时候传递的实际参数只是指针的副本,真正的指针并没有修改,就是说我要把定义的函数内修改的指针带入到主函数中去,使指针真正的改变,所以我要用指针的指针,这样方便我调用函数的时候传递的是指针的地址。综上运用指针的指针才能解决问题
    如果仍然有不解可以参考参考资料里面还有两个链接资料
void CreateBiTree(BiTree *T)
{
 TElemType ch;
 /* scanf("%c",&ch); */
 ch = str[index++];  //index初值为1   全局变量char str[24]
 if (ch == '#')
  *T = NULL;
 else
 {
  *T = (BiTree)malloc(sizeof(BiTNode));
  if (!*T)
   exit(OVERFLOW);
  (*T)->data = ch; /* 生成根结点 */
  CreateBiTree(&(*T)->lchild);               /* 构造左子树 */
  CreateBiTree(&(*T)->rchild);              /* 构造右子树 */
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

4.这段代码是创建二叉树的,其中ch=str[index++];这句纠结我好久其实就是一个很简单的问题,他是先把str[1]赋值给了ch后,index再自加的,我一开始的误区是先自加了以为是从str[2]开始赋值的,所以导致我一直在浪费时间想这个问题。
index++和++index的区别:
index++是先参与运算再自增,自增再下一行开始,++index是先自增再参与运算。
单独使用时他们的功能几乎一模一样,都是让index的值增加1,不同的是与赋值号“=”一起使用时,y=++index表示先将index的值增加1后再把值赋给y,而y=index++表示先把index的值赋给y,之后index自己再增加1。

下面贴出代码:
//https://blog.csdn.net/cyzyfs/article/details/78991480
//这是一篇关于二叉树的博文写的挺好并且里面有几个链接可以参考
//构造二叉树,并实现二叉树的先序遍历,中序遍历和后序遍历。
#include “string.h”
#include “stdio.h”
#include “stdlib.h”
#include “math.h”
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100 /* 存储空间初始分配量 /
typedef int Status; /
Status是函数的类型,其值是函数结果状态代码,如OK等 /
/
用于构造二叉树********************************** /
int index = 1;
typedef char String[24]; /
0号单元存放串的长度 */
String str;//意思为char str[24]
Status StrAssign(String T, char chars)//(char T[24],charchars)
{ int i;
if (strlen(chars) > MAXSIZE)
return ERROR;
else
{
T[0] = strlen(chars);
for (i = 1; i <= T[0]; i++)
T[i] = (chars + i - 1);
return OK;
}
} /
************************************************ /
typedef char TElemType;
TElemType Nil = ’ '; /
字符型以空格符为空 /
Status visit(TElemType e)
{
printf("%c ", e);
return OK;
}
typedef struct BiTNode /
结点结构 /
{
TElemType data; /
结点数据 */
struct BiTNode *lchild, rchild; / 左右孩子指针 */
}BiTNode, BiTree;
/
构造空二叉树T */
Status InitBiTree(BiTree *T)
{
T = NULL;
return OK;
}
/
按前序输入二叉树中结点的值(一个字符) /
/
#表示空树,构造二叉链表表示二叉树T */
void CreateBiTree(BiTree T)
{
TElemType ch;
/
scanf("%c",&ch); */
ch = str[index++]; //index初值为1 全局变量char str[24]
if (ch == ‘#’)
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T)
exit(OVERFLOW);
(T)->data = ch; / 生成根结点 */
CreateBiTree(&(T)->lchild); / 构造左子树 */
CreateBiTree(&(T)->rchild); / 构造右子树 /
}
}
/
初始条件: 二叉树T存在 /
/
操作结果: 若T为空二叉树,则返回TRUE,否则FALSE /
Status BiTreeEmpty(BiTree T)
{
if (T)
return FALSE;
else
return TRUE;
}
/
初始条件: 二叉树T存在。操作结果: 返回T的根 /
TElemType Root(BiTree T)
{
if (BiTreeEmpty(T))
return Nil;
else
return T->data;
}
/
初始条件: 二叉树T存在,p指向T中某个结点 /
/
操作结果: 返回p所指结点的值 /
TElemType Value(BiTree p)
{
return p->data;
}
/
给p所指结点赋值为value /
void Assign(BiTree p, TElemType value)
{
p->data = value;
}
/
初始条件: 二叉树T存在 /
/
操作结果: 前序递归遍历T /
void PreOrderTraverse(BiTree T)//最自然,最常用的遍历方式
{
if (T == NULL)
return;
printf("%c ", T->data); /
显示结点数据,可以更改为其它对结点操作 /
PreOrderTraverse(T->lchild); /
再先序遍历左子树 /
PreOrderTraverse(T->rchild); /
最后先序遍历右子树 /
}
/
初始条件: 二叉树T存在 /
/
操作结果: 中序递归遍历T /
void InOrderTraverse(BiTree T)
{
if (T == NULL)
return;
InOrderTraverse(T->lchild);
printf("%c ", T->data);
InOrderTraverse(T->rchild);
}
/
初始条件: 二叉树T存在 /
/
操作结果: 后序递归遍历T */
void PostOrderTraverse(BiTree T)
{
if (T == NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c “, T->data);
}int main()
{
int i;
BiTree T;
TElemType e1;
InitBiTree(&T);
StrAssign(str, “ABDH#K###E##CFI###G#J##”);//正好放了23个数与全局变量typedef char string[24] string T相吻合
CreateBiTree(&T);
e1 = Root(T);
printf(“二叉树的根为: %c\n”, e1);
printf(”\n前序遍历二叉树:");
PreOrderTraverse(T);
printf("\n中序遍历二叉树:");
InOrderTraverse(T);
printf("\n后序遍历二叉树:");
PostOrderTraverse(T);
i = Root(T);
if (!i)
printf(“树空,无根\n”);
system(“pause”);
return 0;
}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/771085
推荐阅读
相关标签
  

闽ICP备14008679号