您的位置:首页 > 其它

二叉树的反转镜像

2016-10-01 17:27 399 查看
二叉树的镜像就是二叉树对称的二叉树,比如



镜像之后



就是交换每一非叶子节点的左子树指针和右子树指针

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 请按任意键继续…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: