zoukankan      html  css  js  c++  java
  • 剑指offer解题报告(Java版)——二叉树的镜像 19

    引言

       

    发现二叉树的问题很多都是用递归解决的,除了按照剑指offer书中给的递归方法,自己也用栈的方法去实现了,两种方法其实深层次的思想差不多

       

    分析问题

       

    只要我们前序遍历,或者层次遍历二叉树,如果遇到节点就将左右子树交换,即可,递归基就是节点没有左右子树

       

       

    解决问题

       

    利用递归方法

       

    这里要注意Corner Case的考虑

       

    public BinaryTreeNode mirrorRecursively(BinaryTreeNode root) {

    if (root == null || (root.leftNode == null && root.rightNode == null))

    return root;

    // 交换左右子树

    BinaryTreeNode tempBinaryTreeNode = root.leftNode;

    root.leftNode = root.rightNode;

    root.rightNode = tempBinaryTreeNode;

    // 递归下去

    if (root.leftNode != null) {

    mirrorRecursively(root.leftNode);

    }

    if (root.rightNode != null) {

    mirrorRecursively(root.rightNode);

    }

    return root;

    }

       

    栈的方法

       

    栈的方法其实是模拟递归的方法,首先交换左右孩子,将根节点压入栈中,开始考虑左孩子,这时候左孩子就相当于左子树的根节点

       

    如果左孩子不为空,那么同样交换左右孩子,将根节点压入栈中

       

    当左孩子无法再下一层时,也就是左孩子没有左右孩子了,那么弹出栈顶元素,将考虑栈顶元素的右孩子,跟递归的思想一模一样

       

    public BinaryTreeNode mirrorStack(BinaryTreeNode root)

    {

    if(root==null)

    return null;

    BinaryTreeNode node=root;

    Stack<BinaryTreeNode> stack=new Stack<BinaryTreeNode>();

    while(node!=null || !stack.isEmpty())

    {

    while(node!=null)

    {

    BinaryTreeNode temp=node.leftNode;                                

    node.leftNode=node.rightNode;

    node.rightNode=temp;

       

    stack.push(node);

    node=node.leftNode;

    }

    node=stack.pop();

    node=node.rightNode;

    }

    return root;

    }

       

    测试代码

       

    BinaryTreeNode root1=new BinaryTreeNode();

    BinaryTreeNode node1=new BinaryTreeNode();

    BinaryTreeNode node2=new BinaryTreeNode();

    BinaryTreeNode node3=new BinaryTreeNode();

    BinaryTreeNode node4=new BinaryTreeNode();

    BinaryTreeNode node5=new BinaryTreeNode();

    BinaryTreeNode node6=new BinaryTreeNode();

    root1.leftNode=node1;

    root1.rightNode=node2;

    node1.leftNode=node3;

    node1.rightNode=node4;

    node2.leftNode=node5;

    node2.rightNode=node6;

    root1.data=8;

    node1.data=6;

    node2.data=10;

    node3.data=5;

    node4.data=7;

    node5.data=9;

    node6.data=11;

    BinaryTreeNode root2=new BinaryTreeNode();

    BinaryTreeNode a=new BinaryTreeNode();

    BinaryTreeNode b=new BinaryTreeNode();

    root2.leftNode=a;

    root2.rightNode=b;

    root2.data=8;

    a.data=7;

    b.data=2;

    MirrorRecursively test=new MirrorRecursively();

    BinaryTreeNode rootBinaryTreeNode=test.mirrorRecursively(root1);

    System.out.println(root1.rightNode.leftNode.data);

       

  • 相关阅读:
    hbase存储优化
    cloudera manager下phoenix的安装
    Cloudera manager的服务安装以及spark升级到2.2
    redis学习总结
    kylin基础概念和基础性能优化
    mycat使用注意事项
    kylin2.0环境搭建
    ETL实践--kettle转到hive
    集成 SOLR 到 TOMCAT 中(傻瓜教程)
    局域网ip扫描
  • 原文地址:https://www.cnblogs.com/keedor/p/4467590.html
Copyright © 2011-2022 走看看