16--二叉树的镜像

//
//  main.cpp
//  subStructureInTree
//
//  Created by Hugo Cao  on 15/7/10.
//  Copyright (c) 2015年 Hugo Cao . All rights reserved.
//

/*
 问题描述:

    二叉树的镜像:
        围绕着中心轴做左右调换。

就这么短短多几行代码,做递归就可以了。
void mirrorRecuresiveriy(binTree bt)
{
    //判断是否为空,或者是子节点为空。
    if (bt == NULL || (bt->m_pleft == NULL && bt->m_pright == NULL))
    {
        return ;
    }
    //交换左右子树的位置
    binTree pTemp = bt->m_pleft;
    bt->m_pleft = bt->m_pright;
    bt->m_pright = pTemp;

    //传入左结点。
    if (bt->m_pleft)
        mirrorRecuresiveriy(bt->m_pleft);
    //传入右结点。
    if (bt->m_pright)
        mirrorRecuresiveriy(bt->m_pright);
}

 */

#include <iostream>
using namespace std;
#define Data int

typedef struct binaaryTreeNode
{
    Data m_value;
    binaaryTreeNode *m_pleft;
    binaaryTreeNode *m_pright;
}btNode, *binTree;

binTree addNode(Data value)
{
    binTree bt = NULL;
    bt = new btNode;
    if (bt == NULL)
    {
        cout << "申请地址错误" << endl;
        return NULL;
    }

    bt->m_value = value;
    bt->m_pleft = NULL;
    bt->m_pright = NULL;

    return bt;
}

bool connectTreeNode(binTree parrentNode, binTree leftSonNode = NULL, binTree rightSonNode = NULL)
{
    if (parrentNode == NULL || (leftSonNode == NULL && rightSonNode == NULL))
    {
        cout << "结点输入问题" << endl;
        return false;
    }
    parrentNode->m_pleft  = leftSonNode;
    parrentNode->m_pright = rightSonNode;
    return true;
}

binTree createBinaryATree(binTree Ahead)
{
    binTree p1 = addNode(8);
    binTree p2 = addNode(8);
    binTree p3 = addNode(7);
    binTree p4 = addNode(9);
    binTree p5 = addNode(2);
    binTree p6 = addNode(4);
    binTree p7 = addNode(7);

    connectTreeNode(p1, p2, p3);
    connectTreeNode(p2, p4, p5);
    connectTreeNode(p5, p6, p7);

    return (Ahead = p1);
}

//树的镜像。
void mirrorRecuresiveriy(binTree bt)
{
    //判断是否为空,或者是子节点为空。
    if (bt == NULL || (bt->m_pleft == NULL && bt->m_pright == NULL))
    {
        return ;
    }

    //交换左右子树的位置
    binTree pTemp = bt->m_pleft;
    bt->m_pleft = bt->m_pright;
    bt->m_pright = pTemp;

    //传入左结点。
    if (bt->m_pleft)
        mirrorRecuresiveriy(bt->m_pleft);

    if (bt->m_pright)
        mirrorRecuresiveriy(bt->m_pright);
}

void RLR_print_BinaryTree(binTree bt)
{
    if (bt == NULL)
        return ;

    cout << bt->m_value << "  " << endl;
    RLR_print_BinaryTree(bt->m_pleft);
    RLR_print_BinaryTree(bt->m_pright);
}
int main()
{
    binTree bt_A = NULL;
    bt_A = createBinaryATree(bt_A);
    RLR_print_BinaryTree(bt_A);
    cout << endl;

    mirrorRecuresiveriy(bt_A);
    RLR_print_BinaryTree(bt_A);
    return 0;
}
时间: 2025-01-15 23:46:25

16--二叉树的镜像的相关文章

【剑指offer】十二,二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 分析:镜像的递归定义就是将原有二叉树中节点的左右子树对调.代码如下: 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solut

二叉树生成镜像

1 #include <stdio.h> 2 #include <iostream> 3 #include <set> 4 #include <unordered_set> 5 #include <map> 6 #include <queue> 7 #include <vector> 8 #include <string> 9 #include <stack> 10 11 using std::co

剑指OFFER之二叉树的镜像(九度OJ1521)

题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩子,紧接着是右孩子的编号.C

【二叉树】二叉树的镜像

操作给定的二叉树,将其变换为源二叉树的镜像. 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 16 // 后序遍历的一个变型:递归地交换孩子节点的左右孩子,

九度oj题目1521:二叉树的镜像

题目1521:二叉树的镜像 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2061 解决:560 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci=’l’表

刷题18 二叉树的镜像

描述:  操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像示例: 源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 很容易的想到了递归: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) {

18 二叉树的镜像

题目描述:操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 public TreeNode(int val) { 7 this.val = val; 8 } 9 } 10

剑指offer18:操作给定的二叉树,将其变换为源二叉树的镜像。

1 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 2 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 3 思路和方法 (1)递归思想,先交换根节点的左右子树的位置,然后向下递归,把左右子树的根节点作为下次循环的根节点. (2)非递归:所以我们可以采用前序遍历的方法进行操作,每当遇到一个结点的时候,首先判断其是否有左右孩子(有其中之一即可),如果有的话,就交换其左右孩子,然后继续遍历其左右

剑指offer——二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 代码实现(Java) 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val

剑指offer第十七题 二叉树的镜像

操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 1