二叉樹的反轉映象
阿新 • • 發佈:2019-02-08
二叉樹的映象就是二叉樹對稱的二叉樹,比如
映象之後
就是交換每一非葉子節點的左子樹指標和右子樹指標
1:遞迴,如果節點為空,返回,否則交換左右孩子指標;遞迴映象節點的左子樹,右子樹;
2:非遞迴:交換每一非葉子節點的左子樹指標和右子樹指標 ,利用佇列,根節點先入隊;交換佇列第一個節點的左右孩子之針,然後把第一個節點的左右孩子入隊,然後pop();直到佇列為空;即遍歷完畢;
程式碼如下,不足之處多多包涵,多多指教;
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
typedef struct Node
{
char data;
Node*lchild;
Node*rchild;
}Node;
//建立一個節點
Node*BuyNode()
{
Node* p = new(nothrow)Node;
if(p==NULL)
{
exit(-1);
}
memset(p,0,sizeof(Node));
return p;
}
//建立一棵二叉樹
Node* CreateTree(char *&s)
{
if(s==NULL)
{
return NULL;
}
Node*p=NULL;
if((*s) != '$')
{
p = BuyNode();
p->data = *s;
p->lchild = CreateTree(++s);
p->rchild = CreateTree(++s);
}
return p;
}
//先序遞迴遍歷
void Frond(Node*p)
{
if(p)
{
cout<<p->data<<' ';
Frond(p->lchild);
Frond(p->rchild);
}
}
//先序非遞迴遍歷
void _Frond(Node*p)
{
stack<Node*>s;
while(p!=NULL || !s.empty())
{
while(p!=NULL)
{
s.push(p);
cout<<p->data<<" ";
p=p->lchild;
}
if(!s.empty())
{
p= s.top();
s.pop();
p=p->rchild;
}
}
}
//層次遍歷
void CenCi(Node*p)
{
if(p==NULL)
{
return;
}
int m = 0;
queue<Node*>s;
int qsize;
s.push(p);
while(!s.empty())
{
m++;
qsize = s.size();//記錄當前層次的節點數
int i=0;
while(i<qsize)
{
p=s.front();
if(p->lchild)
{
s.push(p->lchild);
}
if(p->rchild)
{
s.push(p->rchild);
}
cout<<p->data<<" ";
s.pop();
i++;
}
cout<<" 當前層次:"<<m<<endl;//顯示當前層次
}
}
//非遞迴翻轉
void _Change(Node*p)
{
if(p==NULL)
{
return ;
}
queue<Node*>s;
s.push(p); //先入隊根節點
while(!s.empty())
{
Node*t = s.front();
Node*tep = t->lchild;
t->lchild = t->rchild;
t->rchild = tep;
if(t->lchild!=NULL) //入左孩子
{
s.push(t->lchild);
}
if(t->rchild !=NULL)//入右孩子
{
s.push(t->rchild);
}
s.pop(); //出隊
}
}
//遞迴翻轉
void Change(Node*p)
{
if(p==NULL)
{
return;
}
swap(p->lchild , p->rchild);
Change(p->lchild);
Change(p->rchild);
}
int main()
{
char*s = "124$$57$$$36$8$$$";
Node*root=CreateTree(s);
cout<<"先序遍歷:";
Frond(root);
cout<<endl;
cout<<"先序遍歷:";
_Frond(root);
cout<<endl;
cout<<"層次遍歷:"<<endl;
CenCi(root);
cout<<endl;
_Change(root);
cout<<endl;
CenCi(root);
cout<<"先序遍歷:";
Frond(root);
return 0;
}
執行結果:
先序遍歷:1 2 4 5 7 3 6 8
先序遍歷:1 2 4 5 7 3 6 8
層次遍歷:
1 當前層次:1
2 3 當前層次:2
4 5 6 當前層次:3
7 8 當前層次:4
1 當前層次:1
3 2 當前層次:2
6 5 4 當前層次:3
8 7 當前層次:4
先序遍歷:1 3 6 8 2 5 7 4 請按任意鍵繼續…