想问一下这段代码的错误,要怎么修改呢?这是二叉树的层次遍历。
树的结构定义为
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
层次遍历
#define Max 100
void LevelorderTraversal( BinTree BT ){
int Q[Max];
int f,r;
f=r=0;
Q[r++]=BT;
BinTree T=NULL;
while(f<r){
T=Q[f++];
printf("%d",T->Data);
if(BT->Left){
Q[r++]=T->Left;
}
if(BT->Right){
Q[r++]=T->Right;
}
}
}
修改如下,改动处见注释,供参考:
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
#define Max 100
void LevelorderTraversal(BinTree BT){
BinTree Q[Max]; //int Q[Max]; 修改
int f,r;
f=r=0;
if (!BT) return;//二叉树为空 修改
BinTree T = BT; //修改
Q[r++] = T;
while(f < r){
T=Q[f++];
printf("%d ",T->Data);
if(BT->Left){
Q[r++]=T->Left;
}
if(BT->Right){
Q[r++]=T->Right;
}
}
}
按照你的遍历代码来看,你每次只是遍历了根节点及其子节点,这样就不能遍历整个二叉树,所以需要在遍历时,将判断条件改为你正在遍历的T节点即可,如下:
……
if(T->Left){
Q[r++]=T->Left;
}
if(T->Right){
Q[r++]=T->Right;
}
……
希望能帮到你,加油~~~
从上到下,从左到右依次遍历。
问题解答:
二叉树的定义: 二叉树是树的一种简单而重要的特殊情况,即树中任何节点都不能有多于两个的子节点,称为"左子树"和"右子树"。
实现代码:
typedef struct node{
int data;
struct node* lchild;
struct node* rchild;
}Node;
Node* createNode(int data){
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->lchild = NULL;
node->rchild = NULL;
return node;
}
void inOrderTraversal(Node* root){
if(root){
inOrderTraversal(root->lchild);
printf("%d ", root->data);
inOrderTraversal(root->rchild);
}
}
void preOrderTraversal(Node* root){
if(root){
printf("%d ", root->data);
preOrderTraversal(root->lchild);
preOrderTraversal(root->rchild);
}
}
void postOrderTraversal(Node* root){
if(root){
postOrderTraversal(root->lchild);
postOrderTraversal(root->rchild);
printf("%d ", root->data);
}
}
void levelOrderTraversal(Node* root){
Node* queue[MAX_SIZE];
int front = -1, rear = -1;
if(root != NULL){
queue[++rear] = root;
}
while(front != rear){
front = (front + 1) % MAX_SIZE;
Node* node = queue[front];
printf("%d ", node->data);
if(node->lchild != NULL){
queue[++rear] = node->lchild;
}
if(node->rchild != NULL){
queue[++rear] = node->rchild;
}
}
}
以上是二叉树的基本代码实现,包括创建结点,遍历二叉树的4个函数,分别为: 中序遍历(左根右)、前序遍历(根左右)、后序遍历(左右根)和层次遍历(自上而下、自左至右)。 其中遍历使用到的是递归方法和队列,层次遍历采用的是循环和队列的结构实现。可以根据题目需求进行选择使用什么方法。