DS二叉树—二叉树镜面反转

题目描述

假设二叉树用二叉链表存储,用先序序列结果创建。输入二叉树的先序序列,请你先创建二叉树,并对树做个镜面反转,再输出反转后的二叉树的先序遍历、中序遍历、后序遍历和层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。

输入

测试次数t

每组测试数据是一个二叉树的先序遍历序列,#表示空树

输出

对每棵二叉树,输出镜面反转后的先序、中序、后序和层次遍历序列。如果空树,输出四个NULL(后面不加空格)。如下:

NULL

NULL

NULL

NULL

输入样例1

3
41#32###65##7##
AB#C##D##
AB##C##

输出样例1

4 6 7 5 1 3 2 
7 6 5 4 3 2 1 
7 5 6 2 3 1 4 
4 6 1 7 5 3 2 
A D B C 
D A C B 
D C B A 
A D B C 
A C B 
C A B 
C B A 
A C B 

NOTICE:这道题有点投机取巧,我并没有专门写一个函数来实现镜面反转,二是在创建二叉树的时候直接将原来的左右孩子进行调换,省事;之后就是常规操作,先序、中序、后序、层次(队列实现)遍历。

#include <iostream>
#include <string>
#include <queue>
using namespace std;

class BiTreeNode
{
public:
	char data;
	BiTreeNode* lchild;
	BiTreeNode* rchild;
	BiTreeNode() :data(' '),lchild(nullptr), rchild(nullptr) {}
	~BiTreeNode() {}
};

class BiTree
{
private:
	BiTreeNode* root;
	BiTreeNode* Create(string s, int& i)
	{
		BiTreeNode* t = nullptr;
		if (s[i] != '#')
		{
			t = new BiTreeNode;
			t->data = s[i];

			//翻转:原来的右孩子在前面,原来的左孩子在后面
			t->rchild = Create(s, ++i);
			t->lchild = Create(s, ++i);
		}
		return t;
	}
	void PreOrder(BiTreeNode* t)
	{
		if (t)
		{
			cout << t->data << " ";
			PreOrder(t->lchild);
			PreOrder(t->rchild);
		}
	}
	void InOrder(BiTreeNode* t)
	{
		if (t)
		{
			
			InOrder(t->lchild);
			cout << t->data << " ";
			InOrder(t->rchild);
		}
	}
	void LastOrder(BiTreeNode* t)
	{
		if (t)
		{
			
			LastOrder(t->lchild);
			LastOrder(t->rchild);
			cout << t->data << " ";
		}
	}
public:
	BiTree() :root(nullptr) {}
	void Create(string s)
	{
		int i = 0;
		root = Create(s, i);
	}
	void PreOrder()
	{
		if (root == nullptr)
			cout << "NULL";
		else
			PreOrder(root);
		cout << endl;
	}
	void InOrder()
	{
		if (root == nullptr)
			cout << "NULL";
		else
			InOrder(root);
		cout << endl;
	}
	void LastOrder()
	{
		if (root == nullptr)
			cout << "NULL";
		else
			LastOrder(root);
		cout << endl;
	}
	void LayerOrder()
	{
		if (root == nullptr)
		{
			cout << "NULL";
			return;
		}
		queue<BiTreeNode*> q;
		q.push(root);
		while (!q.empty())
		{
			if(q.front()->lchild!=nullptr)
				q.push(q.front()->lchild);
			if(q.front()->rchild!=nullptr)
				q.push(q.front()->rchild);

			cout << q.front()->data << " ";
			q.pop();
		}
		cout << endl;
	}
};

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		BiTree mytree;
		string s;

		cin >> s;
		mytree.Create(s);
		mytree.PreOrder();
		mytree.InOrder();
		mytree.LastOrder();
		mytree.LayerOrder();
	}
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值