`

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

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

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

输出:

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

思路:
左右子树交换

如果用循环来做:就是用辅助栈来模拟递归

// 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)
            return;

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

      // 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); 
}

程序基本上一样

///////////////////////////////////////////////////////////////////////
// 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.size())
      {
            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;

            // 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);
      }
}


分享到:
评论

相关推荐

    C语言实现输入一颗二元查找树并将该树转换为它的镜像

    在给定的标题和描述中,任务是实现将一个二元查找树转换为其镜像。镜像二元查找树是原始树的左右子树交换后的结果。例如,如果原始树的结构是左子树-根节点-右子树,那么镜像树的结构将是右子树-根节点-左子树。 ...

    微软面试题——二元查找树转变成排序的双向链表

    二元查找树转变成排序...输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。

    二元查找树转变为双向链表C语言实现

    二元查找树(Binary Search Tree,BST)是一种特殊的数据结构,它的每个节点包含一个键、一个关联值、一个指向左子树的指针和一个指向右子树的指针。在二元查找树中,每个节点的键大于其左子树中的任何节点的键,且...

    我的二元树代码

    - 二元查找树(BST):一种特殊的二元树,其中每个节点的左子树只包含小于该节点的元素,右子树只包含大于该节点的元素,搜索、插入和删除操作的时间复杂度可达到O(log n)。 - 平衡查找树:如AVL树和红黑树,通过...

    AVL树数据结构平衡二叉查找树

    在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者...

    山东大学数据结构课程设计—AVL搜索树

    在二叉搜索树中,对于任意节点,其左子树中所有节点的键均小于该节点的键,而右子树中所有节点的键均大于该节点的键。 **AVL树的特性** 1. **平衡条件**:AVL树的关键特征是平衡因子,即每个节点的左子树高度与右...

    把二元查找树转变成排序的双向链表 源码

    微软面试题第一题 直接就可以运行 不过二元查找树 不知道怎么自动生成 所以硬生生地一个个敲出来的 为了学习二元树的就不用下了

    二元树及其应用

    二元树,也被称为二叉树,是计算机科学中一种重要的数据结构,它在很多算法和应用中都扮演着核心角色。二元树的基本概念基于树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。这种结构使得二元树...

    判断整数序列是否为二元查找树的后序遍历结果的解决方法

    在计算机科学中,二元查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二元查找树中,所有左子树...

    程序员面试题精选100题.docx

    * 将二元查找树转换成双向链表需要使用递归思路,思路一是将左子树和右子树分别转换成双向链表,然后将他们连接起来,思路二是使用中序遍历树,比较小的结点先访问,最后将所有结点连接起来。 * 在将二元查找树转换...

    数据结构与算法课程设计---AVL TREE的实现及分析

    (1)编写 AVL树判别程序,并判别一个二元查找树是否为 AVL树。二元查找树用其先序遍历结果表示,如:5,2,1,3,7,8。 (2)实现 AVL树的 ADT,包括其上的基本操作:结点的加入和删除;另外包括将一般二元查找树...

    程序员面试题精选:C .C++_百度_腾讯_google

    二元查找树是一种特殊的二元树,对于树中的每一个节点,它的左子树中所有元素的值均小于该节点的值,其右子树中所有元素的值均大于该节点的值。这种特性使得二元查找树在查找元素时具有较高的效率。 2. 二元查找树...

    对于含有n个内节点的二元树,证明E=I+2n。其中E、I分别为外部和内部路径长度。

    1. **定义变量**:设nL为左子树中的内节点数量,nR为右子树中的内节点数量,那么整个二叉树的内节点数量n可以表示为n = nL + nR + 1(根节点计入内节点)。 2. **外部节点计数**:设xL为左子树中的外部节点数量,xR...

    公司面试算法经典50题(部分有答案)

    其中一道具体的题目是将二元查找树转换为排序的双向链表。 首先,我们需要了解二元查找树(Binary Search Tree, BST)。二元查找树是一种特殊的二叉树,其特性是每个节点的左子树上的所有节点的值都小于该节点,而...

    VB.net编写的AVL平衡树

    AVL树是一种自平衡二叉查找树(Binary Search Tree, BST),由Georgy Adelson-Velsky和Landis在1962年提出,因此得名AVL树。在AVL树中,任何节点的两个子树的高度最大差别不超过1,这确保了树的平衡性,从而保证了...

    常见:程序员面试题精选100题1

    这个问题提出了一个算法挑战,即如何在不创建新节点的情况下,仅通过修改树中节点的指针,将二元查找树转换成一个排序的双向链表。有以下两种常见的递归策略: a. **思路一:自底向上,逐层处理**: - 首先处理左...

    程序员面试题精选63题

    本题目的核心是将一个二元查找树转换成一个排序的双向链表,这涉及到对树结构的深入理解和递归或迭代的算法设计。 1. **二元查找树**: - 二元查找树是一种特殊的树结构,其中每个节点包含一个键、关联的值、左子...

    程序员面试题精选100题

    二元查找树是一种特殊的树状数据结构,它的每个结点都含有一个关键字(Key),左子树中的关键字都小于根结点的关键字,右子树中的关键字都大于根结点的关键字。这使得二元查找树可以快速地查找、插入、删除关键字。 ...

Global site tag (gtag.js) - Google Analytics