用户输入相应的节点数据对二叉树的节点进行定义,
以‘#’代表空节点,以‘*’代表二叉树构建完成
图片中第一行为输入数据,第二行为中序遍历的结果,第三行为层次遍历的结果。
以下为样例代码:
#include<iostream>
#include<queue>
using namespace std;
class Node {
public:
char data;
Node * left;
Node * right;
};
class binaryTree{
public:
binaryTree(); //构造函数
~binaryTree(); //析构函数
void creat();
void inOrderRe(Node * BtNode);
void levelOrder(Node * BtNode);
Node * getRoot(){
return root;
}
private:
Node * root;
};
//二叉树构造函数,对属性元素进行初始化的操作
binaryTree::binaryTree(){
root = NULL;
}
//二叉树的析构函数,不进行实现
binaryTree::~binaryTree(){
}
//根据用户的输入创建(层次)二叉树的节点,用户的输入形式规定为
//以 '#'代替空节点,以'*'表示结束
void binaryTree::creat(){
queue <Node *> que; //采用队列的形式进行
char temp = ' '; //用以接受用户输入的节点字符
cin>>temp;
int flag = 0; //用于判定当前操作的节点是左子树还是右子树 0 -- 左 1 -- 右
if(temp == '#') //空树
return;
else{
root = new Node();
root->data = temp;
root->left = NULL;
root->right = NULL;
que.push(root);
}
while(1){
cin>>temp;
if(temp == '*')
break;
Node * tempNode = new Node();
tempNode->data = temp;
tempNode->left = NULL;
tempNode->right = NULL;
if(temp != '#' && flag == 0){ //左子树且不为空
flag = 1;
que.front()->left = tempNode;
que.push(tempNode);
}
else if(temp == '#' && flag == 0){ //左子树且为空
flag = 1;
que.front()->left = NULL;
}
else if(temp != '#' && flag == 1){ //右子树不为空
flag = 0;
que.front()->right = tempNode;
que.push(tempNode);
que.pop();
}
else{ //右子树为空
flag = 0;
que.front()->right = NULL;
}
}
}
//二叉树的中序递归遍历
void binaryTree::inOrderRe(Node * BtNode){
if(BtNode){
inOrderRe(BtNode->left);
cout<<BtNode->data<<" ";
inOrderRe(BtNode->right);
}
}
//二叉树的层次遍历
void binaryTree::levelOrder(Node * BtNode){
queue <Node *> que;
que.push(BtNode);
while(!que.empty()){
cout<<que.front()->data<<" ";
if(que.front()->left){
que.push(que.front()->left);
}
if(que.front()->right){
que.push(que.front()->right);
}
que.pop();
}
}
int main(){
binaryTree BT;
BT.creat();
BT.inOrderRe(BT.getRoot());
cout<<endl;
BT.levelOrder(BT.getRoot());
return 0;
}