zoukankan      html  css  js  c++  java
  • 二元查找树镜像实现

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

    例如输入:

    8
    / \
    6 10
    /\ /\
    5 7 9 11

    输出:

    8
    / \
    10 6
    /\  /\
    11 9  7 5

    数据结构如下:

    typedef struct BinaryTreeNode
    {
        int m_value;
        BinaryTreeNode *m_left;
        BinaryTreeNode *m_right;
    }*Tree_root;

    在遍历二元查找树时每访问到一个结点,交换它的左右子树。这种思路用递归不难实现;

    /*
    由于递归的本质是编译器生成了一个函数调用的栈,
    因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。
    */
    void MirrorRecursively(Tree_root root)
    {
        if(!root)
            return;
        BinaryTreeNode *temp = root->m_left;
        root->m_left = root->m_right ;
        root->m_right = temp;
        if(root->m_left)
            MirrorRecursively(root->m_left);
        if(root->m_right)
            MirrorRecursively(root->m_right);
    }
    //下面是用栈来模拟实现
    void Mirror_using_stack(Tree_root root)
    {
        if(!root)
            return;
        stack<BinaryTreeNode *>Binary_Stack;
        Binary_Stack.push(root);
        while(Binary_Stack.size())
        {
            BinaryTreeNode *pNode = Binary_Stack.top();
            Binary_Stack.pop();
            BinaryTreeNode *temp = pNode->m_left;
            pNode->m_left = pNode->m_right ;
            pNode->m_right = temp;
            if(pNode->m_left)
                Binary_Stack.push(pNode->m_left);
            if(pNode->m_right)
                Binary_Stack.push(pNode->m_right);
        }
    }
  • 相关阅读:
    45套精美的 ( Android, iPhone, iPad ) 手机界面设计素材和线框图设计工具
    JAVA基础01
    这是我的第一个博客
    string(更新)
    KMP
    标准C++中的string类的用法总结
    coj 数学作业(300)
    异或的性质及运用
    substr在oracle和mysql中的应用和区别
    非空校验在oracle和mysql中的用法
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3080004.html
Copyright © 2011-2022 走看看