typedef struct Node
{
DataType data;
struct Node *leftChild;
struct Node *rightChild;
}BiTreeNode;//结构体定义
void Initiate(BiTreeNode **root)
{
*root=(BiTreeNode *)malloc(sizeof(BiTreeNode));
(*root)->leftChild=NULL;
(*root)->rightChild=NULL;
}//二叉树的初始化
BiTreeNode *InsertLeftNode(BiTreeNode *curr,DataType x)
{
BiTreeNode *s, *t;
if(curr==NULL) return NULL;
t=curr->leftChild;
s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
s->data=x;
s->leftChild=t;
s->rightChild=NULL;
curr->leftChild=s;
return curr->leftChild;
}//二叉树左插入结点
BiTreeNode *InsertRightNode(BiTreeNode *curr,DataType x)
{
BiTreeNode *s,*t;
if (curr==NULL)return NULL;
t=curr->rightChild;
s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
s->data=x;
s->rightChild=t;
s->leftChild=NULL;
curr->rightChild=s;
return curr->rightChild;
}//二叉树右插入结点
void Destroy (BiTreeNode **root)
{
if ((*root)!=NULL && (*root)->leftChild!=NULL)
Destroy (&(*root)->leftChild);
if((*root)!=NULL && (*root)->rightChild !=NULL)
Destroy (&(*root)->rightChild);
free(*root);
}//撤销二叉树操作
BiTreeNode *DeleteLeftTree(BiTreeNode *curr)
{
if (curr==NULL||curr->leftChild==NULL)return NULL;
Destroy(&curr->leftChild);
curr->leftChild=NULL;
return curr;
}//二叉树左删除结点
BiTreeNode *DeleteRightTree(BiTreeNode *curr)
{
if(curr==NULL||curr->rightChild==NULL)return NULL;
Destroy (&curr->rightChild);
curr->rightChild=NULL;
return curr;
}//二叉树右删除结点
void PreOrder(BiTreeNode *root,void visit(DataType item))
{
if(root!=NULL)
{
visit (root->data);
PreOrder (root->leftChild,visit);
PreOrder(root->rightChild,visit);
}
}//前序遍历二叉树root访问操作为Visit函数
void InOrder(BiTreeNode *root, void visit(DataType item))
{
if(root!=NULL)
{
InOrder(root->leftChild,visit);
visit(root->data);
InOrder(root->rightChild,visit);
}
}//中序遍历二叉树root访问操作为Visit函数
void PostOrder(BiTreeNode *root,void visit(DataType item))
{
if(root!=NULL)
{
PostOrder(root->leftChild,visit);
PostOrder(root->rightChild,visit);
visit(root->data);
}
}//后序遍历二叉树root访问操作为Visit函数
void PrintBiTree(BiTreeNode *root,int n)
{
int i;
if(root==NULL) return;
PrintBiTree (root->rightChild,n+1);
for (i=0;i<n-1;i++)
{
printf(" ");
}
if(n>0)
{
printf("---");
printf("%c\n",root->data);
}
PrintBiTree(root->leftChild,n+1);
}//打印二叉树
BiTreeNode *Search(BiTreeNode *root,DataType x)
{
BiTreeNode *find=NULL;
if(root!=NULL)
{
if(root->data==x)
find=root;
else
{
find=Search(root->leftChild,x);
if(find==NULL)
find=Search(root->rightChild,x);
}
}
return find;
}//查找数据元素
void Visit(DataType item)
{
printf("%c ",item);
}//显示结点信息
# include<stdlib.h>
# include<stdio.h>
typedef char DataType;
#include"BiTree.h"
#include"BiTreeTraverse.h"
void main(void)
{
BiTreeNode *root, *p,*find;
char x='E';
Initiate(&root);
p=InsertLeftNode(root,'A');
p=InsertLeftNode(p,'B');
p=InsertLeftNode(p,'D');
p=InsertRightNode(p,'G');
p=InsertRightNode(root->leftChild,'C');
InsertLeftNode(p,'E');
InsertRightNode(p,'F');
PrintBiTree(root,0);
printf("前序遍历:\n");
PreOrder(root->leftChild,Visit);
printf("中序遍历:\n");
InOrder(root->leftChild,Visit);
printf("后序遍历:\n");
PostOrder(root->leftChild,Visit);
find=Search(root,x);
if(find!=NULL)
printf("\n数据元素%c在二叉树中",x);
else
printf("\n数据元素%c不在二叉树中",x);
Destroy(&root);
}
这个代码是当时我们书上的代码
当时我字节改了BUG以后运行出来的界面一直在自己动向下移动,当时的自己在网上查了好多的的原创的作品,发现环视界面假卡的这块有问题,界面假卡当时网上说的是程序里面的循环是一个死循环,最后我发现我的程序运行界面可以出现但是不能出现数据的原因是因为打印二叉树这里`void PrintBiTree(BiTreeNode *root,int n)
{
int i;
if(root==NULL) return;
PrintBiTree (root->rightChild,n+1);
for (i=0;i<n-1;i++)
{
printf(" “);
}
if(n>0)
{
printf(”—");
printf("%c\n",root->data);
}
PrintBiTree(root->leftChild,n+1);
}//打印二叉树
我将for循环的i++写成了n++
大家遇到界面假卡的问题还是要注意一下自己的循环这边的问题