剑指——二叉树的镜像

7人阅读 评论(2) 收藏 举报
分类:

请完成一个函数,输入一个二叉树,该函数输出它的镜像

思路:先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的俩个子节点。当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

struct BinaryTree
{
  int m_value;
  struct BinaryTree* leftChild;
  struct BinaryTree* rightChild;
};

//index 设置为&类型 则此函数调用后index会发生改变
BinaryTree* createTree(BinaryTree* root,int* s,int& index)
{
    if(s[index]==0)  //如果第一个是0则代表为空
        return NULL;
    root=new BinaryTree;
    root->m_value=s[index];
    root->leftChild=createTree(root->leftChild,s,++index);
    root->rightChild=createTree(root->rightChild,s,++index);
    return root;
}

//前序遍历
void preTraverse(BinaryTree* root)
{
    if(root==NULL)
        return;
    cout<<root->m_value<<endl;
    preTraverse(root->leftChild);
    preTraverse(root->rightChild);
}

//镜像化
void MirrorRecursively(BinaryTree* root)
{
    if(root==NULL)
        return ;
    if(root->leftChild==NULL && root->rightChild==NULL)  //root的左右子节点都是NULL的话不交换
        return ;
    if(root->leftChild==NULL)  
    {
       root->leftChild=root->rightChild;
       root->rightChild=NULL;
    }
    else if(root->rightChild==NULL)
    {
        root->rightChild=root->leftChild;
        root->leftChild=NULL;
    }
    else
    {
        BinaryTree* tmp=root->leftChild;
        root->leftChild=root->rightChild;
        root->rightChild=tmp;
    }
    MirrorRecursively(root->leftChild);
    MirrorRecursively(root->rightChild);
}

int main()
{
    //输入的时候,不能忘记用0来补充NULL值
    int Tree[]={8,6,5,0,0,7,0,0,10,9,0,0,11,0,0};

    int index=0;
    BinaryTree* root=NULL;
    root=createTree(root,Tree,index);

    preTraverse(root);
    cout<<"----"<<endl;

    MirrorRecursively(root);
    preTraverse(root);

    return 0;
}

查看评论

总把新桃换旧符

总把新桃换旧符——写在《最后期限》出版之前上个星期,《最后期限》的编辑给我一个电话,告诉我这本书在本周内就会生产出来了,让我颇感欣慰。从8月以来,心情一直不好,在上海与CSDN网友见面之后也没有什么特...
  • gigix
  • gigix
  • 2002-12-26 15:28:00
  • 2403

【剑指offer】二叉树的镜像

这道题目与上道题目一样,采用数组来作为保存二叉树节点的数据结构,会使测试代码更容易编写。具体的实现算法在代码中比较容易看懂,不细说了,主要想说下,测试时遇到的一些问题(最后AC了): 1、先序...
  • mmc_maodun
  • mmc_maodun
  • 2014-05-16 08:39:59
  • 2638

剑指offer算法实现java版——面试题19二叉树的镜像

  • 2016年03月14日 20:08
  • 3KB
  • 下载

剑指offer:二叉树的镜像 代码实现

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。  输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 /...
  • u010889616
  • u010889616
  • 2015-09-05 09:16:54
  • 545

【剑指Offer】斐波那契数列 解题报告(Python)

【剑指Offer】斐波那契数列 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie...
  • fuxuemingzhu
  • fuxuemingzhu
  • 2018-03-09 18:29:08
  • 22

剑指offer: 二叉树的下一个结点

题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 思路: 中序遍历过程: 代码: ...
  • felinewong
  • felinewong
  • 2017-03-21 15:23:23
  • 93

剑指offer----树的子结构----java实现

输入两颗二叉树A,B,判断B是不是A的子结构。 思路: (1)在树A中找到和数B的根节点相同的节点;    可以利用前序遍历A树中的节点,找到和B树的根节点相同的节点。 (2)在树A中找到...
  • snow_7
  • snow_7
  • 2016-07-07 09:36:13
  • 443

(C++)剑指offer-61:序列化二叉树(树)(再理解)

剑指offer-61:序列化二叉树 目录 剑指offer-61序列化二叉树 目录 1题目描述 2题目答案 1题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 ...
  • malele4th
  • malele4th
  • 2018-02-18 20:27:11
  • 26

剑指-二叉树的镜像

注意此处:不要单独把左右子节点拿出来,会出错,目前还不知道原因 void Mirror(TreeNode *pRoot) { if (pRoot == NULL)return;...
  • wdfscsdn2015
  • wdfscsdn2015
  • 2018-01-21 15:41:41
  • 28

剑指-二叉树镜像

题目: 请完成一个函数,输入一个二叉树,该函数输出他的的镜像. 思路: 先序遍历这棵树的每个结点,如果遍历到结点有子结点,就交换它的两个子结点, 当交换完所有非叶子结点的左右结点之后,就的到...
  • biezhihua
  • biezhihua
  • 2016-08-25 15:11:55
  • 546
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 817
    排名: 6万+
    文章存档
    最新评论