二叉树根据输入字符进行层次创建以及层次遍历

用户输入相应的节点数据对二叉树的节点进行定义,

以‘#’代表空节点,以‘*’代表二叉树构建完成

图片中第一行为输入数据,第二行为中序遍历的结果,第三行为层次遍历的结果。

以下为样例代码:

#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;
}

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值