二叉樹的建立及遍歷(C++實現)

   包含了二叉樹的遞歸建立、前中後序遍歷的遞歸和非遞歸實現以及層序遍歷的非遞歸實現。

#include<iostream>
#include<queue>
#include<stack>
using namespace std;

typedef struct TreeNode{
	char data;
	TreeNode *lchild,*rchild;
}TreeNode;

//輸入二叉樹的前序遍歷序列來構建二叉樹,#號代表結點爲空 
TreeNode* createBinaryTree(TreeNode* root){
	char ch;
	cin>>ch;
	if(ch=='#')
		root=NULL;
	else{
		root=new TreeNode;
		root->data=ch;
		root->lchild=createBinaryTree(root->lchild);
		root->rchild=createBinaryTree(root->rchild);
	}
	return root;
}

//二叉樹前序遍歷的遞歸實現 
void preOrder(TreeNode* root){
	if(!root)
		return;
	else{
		cout<<root->data<<" ";
		preOrder(root->lchild);
		preOrder(root->rchild);
	}
}

//二叉樹中序遍歷的遞歸實現 
void inOrder(TreeNode* root){
	if(!root)
		return;
	else{
		inOrder(root->lchild);
		cout<<root->data<<" ";
		inOrder(root->rchild);
	}
}

//二叉樹後序遍歷的遞歸實現 
void postOrder(TreeNode* root){
	if(!root)
		return;
	else{
		postOrder(root->lchild);
		postOrder(root->rchild);
		cout<<root->data<<" ";
	}
}

//二叉樹層序遍歷的非遞歸實現(採用隊列) 
void levelOrder(TreeNode* root){
	if(!root)
		return;
	queue<TreeNode*> que;
	que.push(root);
	while(!que.empty()){
		TreeNode *cur=que.front();
		que.pop();
		cout<<cur->data<<" ";
		if(cur->lchild)
			que.push(cur->lchild);
		if(cur->rchild)
			que.push(cur->rchild);
	}
} 

//二叉樹前序遍歷的非遞歸實現。(採用函數重載的機制,增加一個bool型參數作爲區分)
//中序遍歷和後序遍歷同前序遍歷 
void preOrder(TreeNode* root,bool isRecur){
	if(!root)
		return;
	stack<TreeNode*> s;
	TreeNode* cur=root;
	while(cur||!s.empty()){
		//迭代訪問結點的左孩子,併入棧
		while(cur){
			cout<<cur->data<<" ";
			s.push(cur);
			cur=cur->lchild;
		}
		if(!s.empty()){
			cur=s.top();
			s.pop();
			cur=cur->rchild;
		} 
	}
} 

void inOrder(TreeNode* root,bool isRecur){
	if(!root)
		return;
	TreeNode* cur=root;
	stack<TreeNode*> s;
	while(cur||!s.empty()){
		while(cur){
			s.push(cur);
			cur=cur->lchild;
		}
		//中序遍歷在左結點爲空時輸出根節點 
		if(!s.empty()){
			cur=s.top();
			s.pop();
			cout<<cur->data<<" ";
			cur=cur->rchild;
		}
	}
} 

//後序遍歷:遍歷順序仍舊是先左後右。因爲是後序遍歷,如果當前棧頂元素有右節點,則不pop,cur=top->right,
//然後把棧頂元素的右指針置爲nullptr 
void postOrder(TreeNode* root,bool isRecur){
	if(!root)
		return;
	TreeNode *cur=root;
	stack<TreeNode*> s;
	while(cur||!s.empty()){
		if(cur){
			s.push(cur);
			cur=cur->lchild;
		}
		else{
			TreeNode* top=s.top();
			if(!top->rchild){
				s.pop();
				cout<<top->data<<" ";
				continue;
			}
			cur=top->rchild;
			top->rchild=nullptr;
		}
	}
} 
int main()
{	TreeNode *root=NULL; 
	root=createBinaryTree(root);
	cout<<"The binary tree has been created successfully!"<<endl;
	cout<<"PreOrder is:";
	preOrder(root);
	cout<<endl;
	cout<<"InOrder is:";
	inOrder(root);
	cout<<endl;
	cout<<"PostOrder is:";
	postOrder(root);
	cout<<endl;
	cout<<"LevelOrder is:";
	levelOrder(root);
	cout<<endl;
	
	cout<<"No-Recur PreOrder is:";
	preOrder(root,0);
	cout<<endl;
	cout<<"No-Recur InOrder is:";
	inOrder(root,0);
	cout<<endl;
	cout<<"No-Recur PostOrder is:";
	postOrder(root,0);
	cout<<endl;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章