zoukankan      html  css  js  c++  java
  • 11.求二元查找树的镜像[MirrorOfBST]

    【题目】

    输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。

    例如输入:

         8
        /  
      6      10
     /       /
    5  7    9   11

    输出:

          8
        /  
      10    6
     /      /
    11  9  7  5

    【递归实现】

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    void Swap(BSTreeNode *left, BSTreeNode *right)
    {
        BSTreeNode *temp = left;
        left = right;
        right = temp;
    }

    ///////////////////////////////////////////////////////////////////////
    // Mirror a BST (swap the left right child of each node) recursively
    // the head of BST in initial call
    ///////////////////////////////////////////////////////////////////////
    void MirrorRecursively(BSTreeNode *pNode)
    {
        
    if(pNode == NULL || (pNode->m_pLeft == NULL && pNode->m_pRight == NULL) )
            
    return;

        
    // swap the right and left child sub-tree
        Swap(pNode->m_pLeft, pNode->m_pRight);

        
    // mirror left child sub-tree if not null
        if(pNode->m_pLeft)
            MirrorRecursively(pNode->m_pLeft);

        
    // mirror right child sub-tree if not null
        if(pNode->m_pRight)
            MirrorRecursively(pNode->m_pRight);
    }

    【非递归实现】

    由于递归的本质是编译器生成了一个函数调用的栈,因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。首先我们把树的头结点放入栈中。在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树。如果它有左子树,把它的左子树压入栈中;如果它有右子树,把它的右子树压入栈中。这样在下次循环中就能交换它儿子结点的左右子树了。参考代码如下:

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    ///////////////////////////////////////////////////////////////////////
    // Mirror a BST (swap the left right child of each node) Iteratively
    // Input: pTreeHead: the head of BST
    ///////////////////////////////////////////////////////////////////////
    void MirrorIteratively(BSTreeNode *pTreeHead)
    {
        
    if(!pTreeHead)
            
    return;

        std::stack<BSTreeNode *> stackTreeNode;
        stackTreeNode.push(pTreeHead);

        
    while(!stackTreeNode.empty())
        {
            BSTreeNode *pNode = stackTreeNode.top();
            stackTreeNode.pop();

            
    // swap the right and left child sub-tree
            //BSTreeNode *pTemp = pNode->m_pLeft;
            //pNode->m_pLeft = pNode->m_pRight;
            //pNode->m_pRight = pTemp;
            Swap(pNode->m_pLeft,pNode->m_pRight);

            
    // push left child sub-tree into stack if not null
            if(pNode->m_pLeft)
                stackTreeNode.push(pNode->m_pLeft);

            
    // push right child sub-tree into stack if not null
            if(pNode->m_pRight)
                stackTreeNode.push(pNode->m_pRight);
        }
    }

    【参考】

    http://zhedahht.blog.163.com/blog/static/2541117420072159363370/

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    【转】以太坊分片:Overview and Finality
    Raiden Network — Ethereum 区块链支付通道
    ERC 和 EIP 代表什么呢?
    【转】什么是加密经济学
    Ethereum Probabilistic Micropayments
    【转】以太坊钱包分析与介绍
    【转】用Python从零开始创建区块链
    【转】用 Go 构建一个区块链
    通用权限管理系统组件 (GPM
    通用权限管理系统组件 (GPM
  • 原文地址:https://www.cnblogs.com/hellogiser/p/3738680.html
Copyright © 2011-2022 走看看