剑指Offer17 二叉树的镜像

  1 /*************************************************************************
  2     > File Name: 17_MirrorOfBinaryTree.cpp
  3     > Author: Juntaran
  4     > Mail: [email protected]
  5     > Created Time: 2016年08月30日 星期二 17时10分03秒
  6  ************************************************************************/
  7
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #include <malloc.h>
 11 #include <bits/stdc++.h>
 12
 13 using namespace std;
 14
 15 // 二叉树结构体
 16 struct TreeNode
 17 {
 18     int val;
 19     TreeNode* left;
 20     TreeNode* right;
 21 };
 22
 23 TreeNode* createTree()
 24 {
 25     TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
 26     root->val = 8;
 27     root->left = (TreeNode*)malloc(sizeof(TreeNode));
 28     root->left->val = 8;
 29     root->right = (TreeNode*)malloc(sizeof(TreeNode));
 30     root->right->val = 7;
 31     root->right->left = NULL;
 32     root->right->right = NULL;
 33     root->left->left = (TreeNode*)malloc(sizeof(TreeNode));
 34     root->left->left->val = 9;
 35     root->left->left->left = NULL;
 36     root->left->left->right = NULL;
 37     root->left->right = (TreeNode*)malloc(sizeof(TreeNode));
 38     root->left->right->val = 2;
 39     root->left->right->left = (TreeNode*)malloc(sizeof(TreeNode));
 40     root->left->right->left->val = 4;
 41     root->left->right->left->left = NULL;
 42     root->left->right->left->right = NULL;
 43     root->left->right->right = (TreeNode*)malloc(sizeof(TreeNode));
 44     root->left->right->right->val = 7;
 45     root->left->right->right->left = NULL;
 46     root->left->right->right->right = NULL;
 47
 48     return root;
 49 }
 50
 51 void Mirror(TreeNode* root)
 52 {
 53     if (root == NULL)
 54         return;
 55     if (root->left==NULL && root->right==NULL)
 56         return;
 57
 58     TreeNode* temp = root->left;
 59     root->left = root->right;
 60     root->right = temp;
 61
 62     if (root->left)
 63         Mirror(root->left);
 64     if (root->right)
 65         Mirror(root->right);
 66 }
 67
 68 // 层序遍历二叉树
 69 void PrintTreeByLevel(TreeNode* root)
 70 {
 71     if (root == NULL)
 72         return;
 73
 74     vector<TreeNode*> vec;
 75     vec.push_back(root);
 76     int cur = 0;
 77     int last = 1;
 78
 79     while (cur < vec.size())
 80     {
 81         last = vec.size();
 82         while (cur < last)
 83         {
 84             printf("%d ", vec[cur]->val);
 85             if (vec[cur]->left != NULL)
 86                 vec.push_back(vec[cur]->left);
 87             if (vec[cur]->right != NULL)
 88                 vec.push_back(vec[cur]->right);
 89
 90             ++ cur;
 91         }
 92         printf("\n");
 93     }
 94 }
 95
 96 int main()
 97 {
 98     TreeNode* tree = createTree();
 99
100     PrintTreeByLevel(tree);
101     printf("\n");
102
103     Mirror(tree);
104     PrintTreeByLevel(tree);
105
106     return 0;
107 }
时间: 2024-08-25 00:37:10

剑指Offer17 二叉树的镜像的相关文章

剑指Offer 二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 思路: 直接一个中间指针,递归,交换左右节点,节点为叶子节点的时候返回. AC代码: 1 class Solution { 2 public: 3 void Mirror(TreeNode *pRoot) { 4 if(pRoot==NULL) 5 return ; 6 7 TreeNode *

剑指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二叉树的镜像python

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 思路 用递归的方法,根节点不变,左子右子交换即可,然后分别递归左右子 代码 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.rig

剑指:二叉树的镜像

题目描述 输入一个二叉树,将它变换为它的镜像. 输入树: 8 / 6 10 / \ / 5 7 9 11 [8,6,10,5,7,9,11,null,null,null,null,null,null,null,null] 输出树: 8 / 10 6 / \ / 11 9 7 5 [8,10,6,11,9,7,5,null,null,null,null,null,null,null,null] 解法 将根结点的左右孩子互换,之后递归左右孩子. /** * Definition for a bina

剑指offer-8 二叉树的下一个节点

剑指offer-8 二叉树的下一个节点 题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 右侧有节点,直接打印 右侧没节点 此节点的父节点的左节点是自己,打印 此节点的父节点的右节点是自己,向上继续找,直到满足2.1 自己解答: /* public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right

剑指offer——二叉树镜像

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

剑指offer17

/**  * 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构)  * @author user  * 思路:参考剑指offer1.首先设置标志位result = false,  * 因为一旦匹配成功result就设为true,剩下的代码不会执行,  * 如果匹配不成功,默认返回false2.递归思想,如果根节点  * 相同则递归调用DoesTree1HaveTree2(),如果根节点不相  * 同,则判断tree1的左子树和tree2是否相同,再判断右子

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

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 1)如果一个节点有右子树,那么它的下一个结点就是它的右子树中的最左子节点: 2)如果一个节点没有右子树,并且它还是它父节点的右子节点,我们可以沿着指向父节点的指针一直向上遍历,知道找到一个是它父节点的右子节点的左子节点的节点,就是第一个向右转的子部分根节点. /* struct TreeLinkNode { int val; struct Tr

60、剑指offer--把二叉树打印成多行

题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 解题思路:可以直到,每次打印一个结点,然后打印下一行时总是先打印其左子结点,然后打印其右子结点.先入先出,使用队列处理.使用toBeprint记录当前行打印的个数,每存入一个-1:nextlevel记录下一行打印结点个数:一行打印完,toBeprint = nextlevel:nextlevel = 0: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *lef