非遞歸實現二叉樹的前序/中序/後序遍歷——題集(十一)
今天分享一下非遞歸實現二叉樹的前序/中序/後序遍歷,以及用不含頭結點的單鏈表存儲集合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;
}
運行結果:
分享如上,如有錯誤,望斧正!願大家學得開心,共同進步!