数据结构-二叉树-二叉树左右孩子交换(递归)

 注:本文采用队列和递归的算法进行创建和层次遍历。同时不能采用BFS和DFS,因为需要把当前根节点的左孩、右孩勾链并输入才能递归下一个根节点;

队列用于存储此时应该递归的根节点;

格式:每一行尾不能有空格;

Description

根据输入利用二叉链表创建二叉树,并将所有结点的左右孩子交换,并输出。

说明:

输入的第一行为根结点;第二行以后每行的第二元为第一元的左孩子,第三元为第一元的右孩子, 0表示空。

输出时按结点层次顺序输出。

Sample Input

A

A B C

B 0 D

C 0 E

D 0 0

E 0 0

Sample Output

A C B

C E 0

B D 0

E 0 0

D 0 0

Hint
说明:输出有换行
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;

typedef struct BiTnode{//二叉链表存储结构
   char data;
   BiTnode *lc;
   BiTnode *rc;
}BiTnode,*BiTree;

void initTree(BiTree &T,char data='*'){//初始化树
    T=new BiTnode;
    T->lc=NULL;
    T->rc=NULL;
    if(data=='*'){
        cin>>T->data;//先输入根节点
    }
    else{
        T->data=data;
    }
}

queue<BiTree>Q;
void creatTree(BiTree &T){//递归创建二叉树
    //不能是BFS和DFS 在递归前需要把当前结点勾链并输入左孩右孩
    //同时运用队列来实现按照层次依次访问每一个非叶子结点(也就是每次递归的根节点)
    if(Q.empty()) return;//递归的终止条件
    char ch;
    int cnt=1;//计数 1左 2右
    while(cin>>ch)//输入此时根节点的左孩、右孩
    { 
	    if(T->data==ch) continue;
	    BiTnode *p=NULL;
	    if(ch!='0'){
	        initTree(p,ch);
        }
	    if(cnt==1){
            T->lc=p;
        }
        else{
            T->rc=p;
        }
	    if(p){
            Q.push(p);
        }
	    if(cnt==2) break;
	    cnt++;
	}
	Q.pop();
    creatTree(Q.front());//递归
}  
void Levelorder(BiTree T){//层次遍历二叉树
    Q.push(T);
    while(!Q.empty())//队列不为空循环
	{
		cout<<Q.front()->data<<" "; 
		if(Q.front()->rc!=NULL){
            cout<<Q.front()->rc->data<<" "; 
            Q.push(Q.front()->rc);//右孩子进队
        } 
		else {
            cout<<"0"<<" ";
        }
		if(Q.front()->lc!=NULL){
            cout<<Q.front()->lc->data<<endl; 
            Q.push(Q.front()->lc);//左孩子进队
        } 
		else {
            cout<<"0"<<"\n";
        }
	    Q.pop();
	}
}

int main(){
	BiTree Tree;//二叉链表
    initTree(Tree);
    Q.push(Tree);//先把根节点进队需要满足判断
    creatTree(Tree);
    Levelorder(Tree);
    return 0;
}

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值