玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

#include<bits/stdc++.h>
using namespace std;
template<class T>
struct treeNode{T data;treeNode *L_child,*R_child;
}; template<class T>
class Tree{public://构造函数,类一声明就运行 Tree(){this->root = new treeNode<T>();root->L_child=root->R_child=NULL; }//返回树的根节点,将root根节点放在私有成员中,在公共方法调用返回使用,提高安全性 treeNode<T>* getRoot(){return this->root;};//创建树节点 ,传递的参数是,中序遍历的数组下标起始和终点,结点的值的下标 treeNode<T>* createNode(int top,int end,int num){if(num>=n||num<0) return NULL;   //前序遍历下标超过n或小于0返回NULL if(top>end) return NULL; int i;for(i=top;i<=end;i++){if(LNROrder[i]==NLROrder[num]) break;}treeNode<T> *node = new treeNode<T>();node->data=NLROrder[num];node->L_child=createNode(top,i-1,num+1);node->R_child=createNode(i+1,end,num+i-top+1);return node;};//输入先序遍历和中序遍历的序列void getOrder(int m){this->n=m;for(int i=0;i<n;i++){cin>>LNROrder[i];}for(int i=0;i<n;i++){cin>>NLROrder[i];}};//将二叉树的左右孩子交换 void changeLR(treeNode<T> *root){if(root==NULL) return;treeNode<T> *temp;temp=root->L_child;root->L_child=root->R_child;root->R_child=temp;changeLR(root->L_child);changeLR(root->R_child);};//层次遍历void  levelFind(treeNode<T> *root){queue<treeNode<T>*> q;treeNode<T> *p;q.push(root);while(!q.empty()){p=q.front();if(p==root){  //这里要注意输出格式,题目每个输出样例的末尾没有空格。 cout<<p->data;}else{cout<<" "<<p->data;}if(p->L_child!=NULL){q.push(p->L_child);}if(p->R_child!=NULL){q.push(p->R_child);}q.pop(); }}private:treeNode<T> *root;//根节点T LNROrder[35];//存储中序遍历数组T NLROrder[35];//存储先序遍历数组int n;//存储遍历长度
}; int main()
{int n;while(cin>>n){Tree<int> *tree = new Tree<int>();tree->getOrder(n);treeNode<int> *root = tree->getRoot();root = tree->createNode(0,n-1,0);tree->changeLR(root);tree->levelFind(root);}
}

解题思路
二叉树,我前面写了一题交换二叉树的左孩子和右孩子,题目说镜像,其实就是左右孩子交换,交换其实很简单,大家可以看方法changeLR(treeNode/< T> * root)函数,就是交换左右孩子函数。然后层次遍历,层次遍历就是按照从上到下,从左到右的顺序遍历输出。需要用到队列,先存入根节点,循环判断队列不为空,输出队首元素的值,然后如果队首元素的左孩子和右孩子存在的情况下,存入队列,队头出队即可。我之前写过的一题层次遍历,用的是同样的方法。
然后我用的是模板类,害,写了这么多题都是用到模板类,用类方法去写代码我感觉清爽很多,大家也可以尝试多用类去写。

C++数据结构——玩转二叉树相关推荐

  1. sdut 3341数据结构实验之二叉树二:遍历二叉树

    数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536K Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如 ...

  2. 【算法与数据结构】查找二叉树的实现

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.题目介绍     二叉树是一种基本的数据结构.查找二叉树是一种方便与查找,删除,插入等功能的二叉树,它要求每 ...

  3. 数据结构34:二叉树前序遍历、中序遍历和后序遍历

    链式存储结构存储的二叉树,对树中结点进行逐个遍历时,由于是非线性结构,需要找到一种合适的方式遍历树中的每个结点. 递归思想遍历二叉树 之前讲过,树是由根结点和子树部分构建的,对于每一棵树来说,都可以分 ...

  4. 数据结构之求二叉树的所有叶子和以及叶子总数

    1.题目 数据结构之求二叉树的所有叶子和以及叶子总数         2.代码实现 tree.java package leetcode.chenyu.test;public class Tree { ...

  5. 数据结构与算法--二叉树第k个大的节点

    二叉树第k个大的节点 二叉树文章列表: 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆(最大堆,最小堆)实现及原理 数据结构与算法–二叉查找树转顺 ...

  6. 数据结构与算法-- 二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径.从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径. 我们用二叉树节点的定义沿用之前文章中 ...

  7. 数据结构与算法-- 二叉树后续遍历序列校验

    二叉树后续遍历序列校验 题目:输入一个整数数组,判断改数组是否是某个二叉搜索树的后续遍历结果,如果是返回true否则false,假设输入数组的任意两个数字不相同. 例如输入{5,7,6,9,11,10 ...

  8. C语言 数据结构 树和二叉树

    树 1.树:是n节点的有限集.树是n(n=>0)个节点的有限集. n=0时成为空树. 在任意一颗非空树中:(1)有且仅有一个称为根的节点:(2)当n>0时,其余节点可分为m(m>0) ...

  9. 7-11 玩转二叉树 (25 分)

    7-11 玩转二叉树 (25 分) 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的 ...

最新文章

  1. php去掉字符串的最后一个字符 substr()的用法
  2. kubernetes关键特性和概述
  3. linux添加定时器防抖,linux驱动2.3按键中断-定时器防抖
  4. linux下tmux
  5. linux 下安装 vim
  6. NYOJ题目1057-寻找最大数(三)
  7. Atitti 数据库事务处理 attilax总结
  8. 在固态硬盘上安装linux系统怎么安装,教程|教你一键重装怎么将系统安装在固态硬盘上...
  9. lua语言入门学习(三)lua语言的小demo之游戏2048
  10. 常用RGB颜色查询对照表及感情色
  11. npz文件转为npy_numpy文件存取-npz,npy
  12. 原生js和jquery 获取文档高度
  13. c#记录合并PDF和word
  14. Open Yale course:Listening to Music
  15. win10系统引导修复
  16. 『Android开源控件』Banner广告图片轮播控件
  17. 过滤百度广告+搜索热点+adblock规则快速入门
  18. 《计算机存储与外设》----2.3 DRAM
  19. MySQL —— 14、触发器
  20. [GWCTF 2019]枯燥的抽奖 1

热门文章

  1. IPO中的锁定期规则
  2. python个人总结(二)
  3. SpringBoot时区问题解决,彻底解决时差问题
  4. 苹果手机发不出短信-显示尚未送达的红色感叹号
  5. leeetcode77 组合
  6. 会议室大屏幕用投影还是拼接屏好?
  7. 根据excel模板导出excel
  8. 单片机 李广弟_单片机基础(第3版)
  9. Linux下生产者与消费者模型
  10. 4 个现在就该去装的 Firefox 扩展