`

二叉树复制和左右子树互换

阅读更多
题目的地址:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1021
题目的描述:
二叉树复制和左右子树互换
时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:272            测试通过:174

描述


二叉树是非常重要的树形数据结构。复制一棵二叉树是在另一个存储区存放相同的结构和内容,而一棵二叉树上所有左右子树互换是在原存储区上的运算。



请分别根据先序遍历序列建立两棵的二叉树(用#代表空树或空子树),再将这两棵二叉树复制为左右子树建立第三棵二叉树,输出先序和层次遍历序列,最后将第三棵二叉树上所有左右子树互换,并输出先序和层次遍历序列。


输入


共三行

前两行分别对应两棵二叉树的先序遍历序列,用#代表空树或空子树

第三行为第三棵二叉树的根结点。


输出


共四行

前两行为第三棵二叉树生成时的先序、层次遍历序列,

后两行为第三棵二叉树左右子树互换后的先序、层次遍历序列。


样例输入

B # D # #
C E # # F # #
A

样例输出

PreOrder: A B D C E F
LevelOrder: A B C D E F
PreOrder: A C F E B D
LevelOrder: A C B F E D


其实整个题目没有什么难度,算是一道彻底的水题。左右子树的互换涉及到分治法的思想,即如果从根节点开始看,换根节点的左右子树。每个子树的根节点又互换它们的左右子树。那么子问题的解构成了原问题的解。而且与动态规划不同的是,子问题的解是相互独立的,故可以很方便的用递归求解出来。
发现分治和搜索都是递归的(当然也可以写成非递归,但是有点麻烦,本人较懒),而动态规划则会用一个备忘录记录子问题的解,需要时就会使用。故分治和搜索的时间复杂度就会比较高,通常是指数级别(尤其是问题域比较大时,搜索的时间复杂度会非常高,这就需要强剪枝),而动态规划思考非常难,但是一旦写出,时间复杂度会控制在n的平方或n的立方左右。
题目的代码为:
#include<iostream>
#include<vector>
using namespace std;
//二叉树的节点
typedef struct node{
  
  char data;
  struct node *lchild;
  struct node *rchild;        
}myNode; 
vector<myNode*> myV;
//创建二叉树
myNode* createTree(myNode* root)
{
  char ch;
  cin>>ch;
  if(ch=='#')
  {
      return root; 
  } 
  root=new myNode();
  root->data=ch;
  root->lchild=createTree(root->lchild);
  root->rchild=createTree(root->rchild);
  
  return root;
} 
//先序遍历
void preOrder(myNode *root)
{
   if(root!=NULL)
   {
      cout<<" "<<root->data;
      preOrder(root->lchild);
      preOrder(root->rchild); 
   } 
} 
//层次遍历
//层次遍历二叉树
void levelOrder(myNode *root)
{
     if(root!=NULL)
     {
           myV.push_back(root);
           
           while(!myV.empty())
           {
              int i;
              for(i=0;i<myV.size();i++)
              {
                  myNode *temp=myV[i]; 
                  
                  cout<<" "<<temp->data;
                  if(temp->lchild!=NULL)
                  {
                      myV.push_back(temp->lchild); 
                  }
                  if(temp->rchild!=NULL)
                  {
                      myV.push_back(temp->rchild); 
                  }
              }
              //删除
              vector<myNode*> newV;
              for(;i<myV.size();i++)
              {
                    newV.push_back(myV[i]);
              }
              myV=newV;
           }
     }
} 
//层层转换左右子树
myNode* transform(myNode *root)
{
     if(root!=NULL)
     { 
         root->lchild=transform(root->lchild);
         root->rchild=transform(root->rchild);
         myNode *temp=root->lchild;
         root->lchild=root->rchild;
         root->rchild=temp;
     }
     return root;
} 
int main()
{
   myNode *root1=NULL,*root2=NULL,*root3=NULL;
   root1=createTree(root1);
   root2=createTree(root2);
   root3=new myNode();
   char ch;
   cin>>ch;
   root3->data=ch;
   root3->lchild=root1;
   root3->rchild=root2;
   cout<<"PreOrder:";
   preOrder(root3);
   cout<<endl;
   cout<<"LevelOrder:";
   levelOrder(root3);
   cout<<endl;
   root3=transform(root3);
   cout<<"PreOrder:";
   preOrder(root3);
   cout<<endl;
   cout<<"LevelOrder:";
   levelOrder(root3);
   cout<<endl;
   
   system("pause");
   return 0; 
}

其实不应该使用vector,而应该自己写个队列的,但是实在是不想写,就用现成的stl容器了。天气太热了....
分享到:
评论

相关推荐

    二叉树类交换左右子树

    c++程序代码,实现了二叉树类的建立,遍历,以及交换所有结点的左右子树

    编写算法交换二叉树中所有结点的左右子树.doc

    该算法使用 C 语言实现,通过建立二叉树、先序遍历输出结点数据和后序遍历交换左右子树三个步骤来实现。 一、建立二叉树 首先,需要建立一个二叉树。该算法使用队列来存储结点指针,以便便捷地访问和遍历二叉树。...

    erchashu.rar_交换 二叉树 左右子树_交换左右子树

    本主题聚焦于“交换二叉树的左右子树”的操作。二叉树的每个节点通常包含两个子节点,一个称为左子节点,另一个称为右子节点。交换左右子树的操作改变了树的结构,但不改变节点的值。 首先,我们来理解二叉链表方式...

    二叉树左右子树交换(数据结构)

    这是数据结构的练习,利用c++语言编写,进行二叉树的左右子树交换,代码简洁但很实用

    数据结构 上机实验2,包括深度,层次遍历二叉树,计算深度等

    文件"实验2_1021_二叉树复制和左右子树互换.cpp"可能包含了这两个操作的实现。二叉树的复制通常涉及到深度复制(包括节点及所有子节点);而左右子树互换是二叉树的一种变换,可以改变其结构。 通过这个实验,学生...

    二叉树的左右子树交换(C++)

    通过上述分析,我们可以看到,二叉树的左右子树交换涉及到对二叉树节点结构的理解和操作。在实际编程中,注意细节的处理,比如正确地交换子节点的指针,是至关重要的。此外,利用递归的思想来实现二叉树的操作是一种...

    交换二叉树左右子树的运算

    以上两种方法都能有效地完成交换二叉树左右子树的任务,选择哪种取决于具体的需求和场景。在实际应用中,我们需要根据二叉树的大小、深度以及对空间和时间复杂性的要求来选择合适的实现方式。例如,如果二叉树较深,...

    交换左右子树

    二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——(a); (2)只有一个根结点的二叉树——(b); (3)右子树为空的二叉树——(c); (4)左子树为空的二叉树——(d); (5)完全...

    题目:编写递归算法,将二叉树中所有结点的左右子树相互交换 - READ.doc

    递归交换算法是二叉树中结点左右子树的交换算法的设计和实现,涉及到树形结构、递归函数、指针操作等多个方面。该算法的设计和实现需要考虑到问题的规模、复杂度和时间复杂度等方面。通过测试结果的分析,可以验证...

    将二叉树所有结点的左右子树交换并输出。

    在这个问题中,我们的目标是编写一个程序,交换二叉树所有节点的左右子树,并输出交换后的结果。这通常涉及到递归操作,对于理解和实现二叉树的算法至关重要。 首先,让我们解析给定的文件名。`BinaryTree.java`...

    二叉树的创建 遍历 交换子树

    该函数交换二叉树节点的左右子树,同时递归地对左右子树执行相同的操作。交换完成后,可以通过遍历二叉树并打印节点序列,对比交换前后的节点顺序,从而验证交换是否成功。 在主函数`main`中,首先提示用户按先序...

    二叉树交换左右子树 查询祖先结点

    二叉树是一种特殊的树结构,每个节点最多有两个...这些资源可以帮助我们更好地理解和实践二叉树交换左右子树以及查询祖先结点的操作。通过分析和实践这些内容,可以提升对二叉树操作的掌握,从而在实际问题中灵活运用。

    二叉树的便历及交换左右子树

    总结一下,二叉树的遍历和交换左右子树是数据结构和算法领域中的基础操作。理解并熟练掌握这些概念对于编程和解决问题至关重要。在实际项目中,例如在构建搜索引擎索引、实现游戏逻辑或优化数据库查询时,二叉树及其...

    交换二叉树中所有结点的左右子树

    建立一棵二叉树按层次遍历该二叉树,并实现将二叉树中所有的结点的左右子树交换,显示其结果

    递归交换所有左右子树

    递归实现左右子树的互换的函数,上面还有完整的建树及遍历等一些基本操作

    二叉树遍历、交换左右子树、统计叶节点及树的宽度

    可实现二叉树基本功能:统计叶节点数目、树的宽度、逐层遍历、交换左右子树后遍历。

    计算叶子节点数,和交换左右子树

    在给定的标题和描述中,我们有三个关键的知识点:计算二叉树的叶子节点数量、交换二叉树中所有节点的左右子树以及根据前序遍历和中序遍历来构造二叉树。这些任务通常涉及到C++编程和模板类的应用。 首先,让我们...

    用栈实现二叉树(c++源码)

    可实现以下功能: ************Menu************ 1---建立二叉树 2---前序遍历(递归) 3---前序遍历(非递归) 4---中序遍历(递归) 5---中序遍历(非递归) ...11---交换左右子树 0---退出

    二叉树性质 遍历序列和互换.ppt

    在IT领域,特别是数据结构和...以上就是关于二叉树性质、遍历序列和结点左右子树互换的详细解析,这些知识对于理解和操作二叉树至关重要。在实际编程和解决问题中,熟练掌握这些内容能有效提升算法设计和问题解决能力。

Global site tag (gtag.js) - Google Analytics