剑指offer系列16---二叉树的镜像

【题目】二叉树的镜像
【思路】方法一:采用递归方式进行交换,先交换根节点的左右节点,接着交换左右结点的左右结点
    方法二:采用非递归方式,即依次遍历左右子树结点依次交换,采用栈操作方式stack

  1 package com.exe4.offer;
  2 import java.util.Stack;
  3
  4 /**
  5  * 16【题目】二叉树的镜像
  6  *    【思路】方法一:采用递归方式进行交换,先交换根节点的左右节点,接着交换左右结点的左右结点
  7  *             方法二:采用非递归方式,即依次遍历左右子树结点依次交换,采用栈操作方式stack
  8  * @author WGS
  9  *
 10  */
 11 public class TreeMirror {
 12     //二叉树结点定义
 13     public static class TreeNode {
 14         int val = 0;
 15         TreeNode left = null;
 16         TreeNode right = null;
 17
 18         public TreeNode(int val) {
 19             this.val = val;
 20
 21         }
 22
 23     }
 24     //采用递归方式进行交换,先交换根节点的左右节点,接着交换左右结点的左右结点
 25     public void mirrorExchange(TreeNode node){
 26         if(node==null || node.left==null || node.right==null){
 27             return;
 28         }
 29         //开始交换根节点的左右结点
 30         TreeNode tempNode=null;
 31         tempNode=node.left;
 32         node.left=node.right;
 33         node.right=tempNode;
 34
 35         //继续交换
 36         if(node.left!=null)
 37             mirrorExchange(node.left);
 38         if(node.right!=null)
 39             mirrorExchange(node.right);
 40     }
 41     //采用非递归方式,即依次遍历左右子树结点依次交换,采用栈操作方式s
 42     public void mirrorExchange2(TreeNode root){
 43         if(root==null || root.left==null || root.right==null){
 44             return;
 45         }
 46          Stack<TreeNode> stack = new Stack<TreeNode>();
 47          stack.push(root);
 48          while(!stack.isEmpty()){
 49              TreeNode node=stack.pop();
 50              //交换左右结点
 51              TreeNode temp=node.left;
 52              node.left=node.right;
 53              node.right=temp;
 54              //继续遍历下一个左右结点
 55              if(node.left!=null)
 56                  stack.push(node.left);
 57              if(node.right!=null)
 58                  stack.push(node.right);
 59          }
 60     }
 61
 62     //前序遍历1
 63     public void preInOreder(TreeNode T){
 64         if(T==null) return;
 65         System.out.println(T.val);
 66         preInOreder(T.left);
 67         preInOreder(T.right);
 68     }
 69      //前序遍历2
 70     public void preOrderTarverse(TreeNode root) {
 71         Stack<TreeNode> s = new Stack<TreeNode>();
 72         while (root != null || !s.isEmpty()) {
 73             //遍历左子树
 74             while (root != null) {
 75                 System.out.println(root.val);
 76                 s.push(root);
 77                 root = root.left;
 78             }
 79             // 左子树遍历结束,继续遍历右子树
 80             if (!s.isEmpty()) {
 81                 root = s.pop();
 82                 root = root.right;
 83             }
 84         }
 85     }
 86
 87     public static void main(String[] args) {
 88         TreeNode root = new TreeNode(8);
 89         TreeNode node1 = new TreeNode(6);
 90         TreeNode node2 = new TreeNode(10);
 91         TreeNode node3 = new TreeNode(5);
 92         TreeNode node4 = new TreeNode(7);
 93         TreeNode node5 = new TreeNode(9);
 94         TreeNode node6 = new TreeNode(11);
 95
 96         root.left = node1;
 97         root.right = node2;
 98         node1.left = node3;
 99         node1.right = node4;
100         node2.left = node5;
101         node2.right = node6;
102
103         TreeMirror r = new TreeMirror();
104         r.mirrorExchange2(root);
105
106         r.preOrderTarverse(root);
107     }
108 }
时间: 2024-10-09 03:54:07

剑指offer系列16---二叉树的镜像的相关文章

剑指offer 19:二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 解题思路 这一问题明显,在进行递归遍历节点时,将根节点的左右子树进行交换,因此完成树的遍历即可. C++实现代码 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public

剑指offer系列——重建二叉树

Q:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. C:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M A: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { if (pr

【剑指offer】Q19:二叉树的镜像

def MirroRecursively(root): # root is None or just one node, return root if None == root or None == root.left and None == root.right: return root root.left, root.right = root.right, root.left MirroRecursively(root.left) MirroRecursively(root.right) r

剑指OFFER之重建二叉树(九度OJ1385)

题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序

剑指Offer:重建二叉树【7】

剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 分析 我们首先要明白前序和中序构建二叉树的流程,流程理解了才是解题的关键: 如上图所示,前序遍历可以找到头结点,然后在中序遍历中找到它的位置 比如,1的位置为i,那么startIn~i-1就是它的左子树的中序遍历,st

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

[剑指offer]8.重建二叉树

题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 8.重建二叉树 * 结果:AC * 网址:http://www.nowcoder

【Java】 剑指offer(37) 序列化二叉树

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,但是其实可以只采用前序遍历(从根结点开始),将空结点(null)输出为一个特殊符号(如“$”),就可以确定一个二叉树了. 将二叉树序列化为字符串,就是前序遍历的过程,遇见空结点时,序列化为“$”,每个结点间使用逗号分隔开. 将字符串反序列化为二叉树,也使用前