题目:请你编写完整的程序构建一棵二叉树并对其进行先序遍历、中序遍历、后序遍历与层次遍历,分别打印并输出遍历结果
难度:★★★
二叉树的存储结构
typedef struct Node{char data;//数据域struct Node* left;//左子树struct Node* right;//右子树}BiNode,*BiTree;//二叉链表
二叉树的构建
按照先序遍历的的顺序逐个输入结点的值来构建二叉树,其中,以字符‘#’表示该结点为叶子结点,即没有左右孩子,递归地构建左子树与右子树。
void CreateBiTree(BiTree &T)
{//按先序序列输入二叉树中的结点值 char key; printf("请先序输入字符:");scanf("%c",&key);//输入#代表该结点为叶子结点,结束插入if(key == '#') T = NULL;else{//分配空间创建新结点 T = (BiNode*) malloc (sizeof(BiNode));T->data = key;CreateBiTree(T->left) ; //构造左子树CreateBiTree(T->right) ;//构造右子树 }
}
二叉树先序遍历
//先序遍历(根左右)
void PreOrder(BiTree T){if(T){visit(T);PreOrder(T->left);PreOrder(T->right);}
}
二叉树中序遍历
//中序遍历(左根右)
void InOrder(BiTree T){if(T){InOrder(T->left);visit(T);InOrder(T->right);}
}
二叉树后序遍历
//后序遍历(左右根)
void PostOrder(BiTree T){if(T){PostOrder(T->left);PostOrder(T->right);visit(T);}
}
二叉树层次遍历
//层次遍历(自上而下,从左到右)
void LevelOrder(BiTree T){InitQueue(Q);//初始化一个队列BiTree p;//p为当前遍历的结点EnQueue(Q,p);//根节点入队while(!IsEmpty(Q)){DeQueue(Q,p);visit(p);if(p->left!=NULL){//左孩子入队EnQueue(Q,p->left); }if(p->right!=NULL){//右孩子入队EnQueue(Q,p->right); }}
}
完整代码
#include<iostream>
#include<stdlib.h>
#include<queue>
using namespace std;
typedef struct Node{char data;struct Node* left;struct Node* right;
}BiNode,*BiTree;//构建二叉树
void CreateBiTree(BiTree &T)
{//按先序序列输入二叉树中的结点值 char key; printf("请先序输入字符:");scanf("%c",&key);//输入#代表该结点为叶子结点,结束插入if(key == '#') T = NULL;else{//分配空间创建新结点 T = (BiNode*) malloc (sizeof(BiNode));T->data = key;CreateBiTree(T->left) ; //构造左子树CreateBiTree(T->right) ;//构造右子树 }
}//访问并输出根结点
void visit(BiTree T){cout<<T->data<<" ";
} //先序遍历:DLR
void PreOrder(BiTree T){if(T){visit(T);PreOrder(T->left);PreOrder(T->right);}
} //中序遍历:LDR
void InOrder(BiTree T){if(T){InOrder(T->left);visit(T);InOrder(T->right);}
} //后序遍历:LRD
void PostOrder(BiTree T){if(T){PostOrder(T->left);PostOrder(T->right);visit(T);}
} //层序遍历
void LevelOrder(BiTree T){if(T==NULL) return ;queue<BiTree>que;que.push(T);while(!que.empty()){BiTree ptr=que.front();cout<<ptr->data<<" ";que.pop();if(ptr->left!=NULL)que.push(ptr->left);if(ptr->right!=NULL)que.push(ptr->right);}
} int main(){BiTree T;CreateBiTree(T);cout<<"二叉树构建完成!"<<endl;cout<<"先序遍历:";PreOrder(T);cout<<endl;cout<<"中序遍历:";InOrder(T);cout<<endl;cout<<"后序遍历:";PostOrder(T);cout<<endl;cout<<"层序遍历:";LevelOrder(T);cout<<endl;return 0;
}