實現二叉樹的前序/中序/後序非遞歸遍歷——題集(十一)

非遞歸實現二叉樹的前序/中序/後序遍歷——題集(十一)

       今天分享一下非遞歸實現二叉樹的前序/中序/後序遍歷,以及用不含頭結點的單鏈表存儲集合A和B,求解集合A與B的差集,並將結果保存在集合A的單鏈表中。。

       實現二叉樹的前序/中序/後序非遞歸遍歷的源代碼和運行示例。

源代碼如下:

#include<iostream>
using namespace std;
#include<stack>
 
//二叉樹的前序/中序/後序非遞歸遍歷
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x)
:val(x)
,left(NULL)
,right(NULL)
{
    }
};
 
//前序非遞歸遍歷
void PreTraNR(TreeNode* root){//藉助棧
cout<<"前序非遞歸遍歷: ";
if(root==NULL){
cout<<endl;
return;
}
TreeNode* cur=root;
stack<TreeNode*> tmp;
tmp.push(cur);
 
while(!tmp.empty()){
cur=tmp.top();
 
while(cur->left != NULL){
cout<<cur->val<<" ";
cur=cur->left;
tmp.push(cur);
}
cout<<cur->val<<" ";
 
while(cur->right==NULL){
tmp.pop();
if(tmp.empty()){
cout<<endl;
return;
}
cur=tmp.top();
}
tmp.pop();
cur=cur->right;
tmp.push(cur);
}
 
cout<<endl;
return;
}
 
//中序非遞歸遍歷
void OrdTraNR(TreeNode* root){//藉助棧
cout<<"中序非遞歸遍歷: ";
if(root==NULL){
cout<<endl;
return;
}
TreeNode* cur=root;
stack<TreeNode*> tmp;
tmp.push(cur);
 
while(!tmp.empty()){
cur=tmp.top();
 
while(cur->left != NULL){
cur=cur->left;
tmp.push(cur);
}
 
cout<<cur->val<<" ";
 
while(cur->right==NULL){
tmp.pop();
if(tmp.empty()){
cout<<endl;
return;
}
cur=tmp.top();
cout<<cur->val<<" ";
}
tmp.pop();
cur=cur->right;
tmp.push(cur);
}
 
cout<<endl;
return;
}
 
//後序非遞歸遍歷
void PostTraNR(TreeNode* root){//藉助棧
cout<<"後序非遞歸遍歷: ";
if(root==NULL){
cout<<endl;
return;
}
TreeNode* cur=root;
TreeNode* prev=NULL;
stack<TreeNode*> tmp;
tmp.push(cur);
 
while(!tmp.empty()){
cur=tmp.top();
 
while(cur->left != NULL){
//prev=cur;
cur=cur->left;
tmp.push(cur);
}
 
while(cur->right == prev || cur->right==NULL){
cout<<cur->val<<" ";
prev=cur;
tmp.pop();
if(tmp.empty()){
cout<<endl;
return;
}
cur=tmp.top();
}
cur=cur->right;
tmp.push(cur);
}
 
cout<<endl;
return;
}
 
void TestTree()//二叉樹的前序/中序/後序非遞歸遍歷
{
cout<<"二叉樹的前序/中序/後序非遞歸遍歷"<<endl<<endl;
TreeNode * pRoot1=new TreeNode(1);
TreeNode * pRoot2=new TreeNode(2);
TreeNode * pRoot3=new TreeNode(3);
TreeNode * pRoot4=new TreeNode(4);
TreeNode * pRoot5=new TreeNode(5);
TreeNode * pRoot6=new TreeNode(6);
TreeNode * pRoot7=new TreeNode(7);
TreeNode * pRoot8=new TreeNode(8);
TreeNode * pRoot9=new TreeNode(9);
 
pRoot1->left = pRoot2;
pRoot1->right = pRoot3;
pRoot2->left = pRoot4;
pRoot2->right = pRoot5;
pRoot3->left = pRoot6;
pRoot3->right = pRoot7;
pRoot4->left = pRoot8;
PreTraNR(pRoot1);//前序非遞歸遍歷
OrdTraNR(pRoot1);//中序非遞歸遍歷
 
PostTraNR(pRoot1);//後序非遞歸遍歷
}
 
int main(){
TestTree();//二叉樹的前序/中序/後序非遞歸遍歷
 
system("pause");
return 0;
}

運行結果:

 

       已知集合A和B的元素分別用不含頭結點的單鏈表存儲,函數difference()用於求解集合A與B的差集,並將結果保存在集合A的單鏈表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成計算後A={10,20,30}。

      鏈表結點的結構類型定義如下:

struct node
{
int elem;
node* next;
};

       用不含頭結點的單鏈表存儲集合A和B,求解集合A與B的差集,並將結果保存在集合A的單鏈表中。其函數void difference(node** LA , node* LB)的源代碼和運行示例。

源代碼如下:

#include<iostream>
using namespace std;

//用不含頭結點的單鏈表存儲集合A和B,求解集合A與B的差集,並將結果保存在集合A的單鏈表中。
struct ListNode{
	int val;
	ListNode* next;
	ListNode(int _val)
	:val(_val)
	,next(NULL)
	{}
};

void  DifSet(ListNode** LA, ListNode* LB ){
	if(LB == NULL || LA == NULL) return;

	ListNode* cur=*LA;
	while(LB){
		cur=*LA;
		ListNode* prev=NULL;
		while(cur){
			if(cur->val == LB->val){
				if(prev)
					prev->next=cur->next;
				else
					*LA=cur->next;
				delete cur;
				break;
			}
			prev=cur;
			cur=cur->next;
		}
		LB=LB->next;
	}

	return;
}

void TestSet(){//求解集合A與B的差集
	ListNode * lA1=new ListNode(1);
	ListNode * lA2=new ListNode(2);
	ListNode * lA3=new ListNode(3);
	ListNode * lA4=new ListNode(4);
	ListNode * lA5=new ListNode(5);
	ListNode * lA6=new ListNode(6);
	ListNode * lA7=new ListNode(7);
	ListNode * lA8=new ListNode(8);

	lA1->next = lA2;
	lA2->next = lA3;
	lA3->next = lA4;
	lA4->next = lA5;
	lA5->next = lA6;
	lA6->next = lA7;
	lA7->next = lA8;

	ListNode * lB1 = new ListNode(1);
	ListNode * lB2 = new ListNode(4);
	ListNode * lB3 = new ListNode(6);
	ListNode * lB4 = new ListNode(8);
	ListNode * lB5 = new ListNode(11);
	
	lB1->next = lB2;
	lB2->next = lB3;
	lB3->next = lB4;
	lB4->next = lB5;

	cout<<"求解不含頭結點的單鏈表存儲集合lA1與lB1的差集,"<<endl<<"並將結果保存在集合lA1的單鏈表中"<<endl<<endl;
	cout<<"打印集合lA1: ";
	Printf(lA1);
	cout<<"打印集合lB1: ";
	Printf(lB1);
	DifSet( &lA1, lB1);
	cout<<"DifSet( &lA1, lB1)->打印集合lA1與lB1的差集結果; ";
	Printf(lA1);
}

int main(){
	TestSet();//求解集合A與B的差集
	
	system("pause");
	return 0;
}

運行結果:

 

       分享如上,如有錯誤,望斧正!願大家學得開心,共同進步!

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