题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
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);
}
}
分享到:
相关推荐
在给定的标题和描述中,任务是实现将一个二元查找树转换为其镜像。镜像二元查找树是原始树的左右子树交换后的结果。例如,如果原始树的结构是左子树-根节点-右子树,那么镜像树的结构将是右子树-根节点-左子树。 ...
二元查找树转变成排序...输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。
二元查找树(Binary Search Tree,BST)是一种特殊的数据结构,它的每个节点包含一个键、一个关联值、一个指向左子树的指针和一个指向右子树的指针。在二元查找树中,每个节点的键大于其左子树中的任何节点的键,且...
- 二元查找树(BST):一种特殊的二元树,其中每个节点的左子树只包含小于该节点的元素,右子树只包含大于该节点的元素,搜索、插入和删除操作的时间复杂度可达到O(log n)。 - 平衡查找树:如AVL树和红黑树,通过...
在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者...
在二叉搜索树中,对于任意节点,其左子树中所有节点的键均小于该节点的键,而右子树中所有节点的键均大于该节点的键。 **AVL树的特性** 1. **平衡条件**:AVL树的关键特征是平衡因子,即每个节点的左子树高度与右...
微软面试题第一题 直接就可以运行 不过二元查找树 不知道怎么自动生成 所以硬生生地一个个敲出来的 为了学习二元树的就不用下了
二元树,也被称为二叉树,是计算机科学中一种重要的数据结构,它在很多算法和应用中都扮演着核心角色。二元树的基本概念基于树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。这种结构使得二元树...
在计算机科学中,二元查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二元查找树中,所有左子树...
* 将二元查找树转换成双向链表需要使用递归思路,思路一是将左子树和右子树分别转换成双向链表,然后将他们连接起来,思路二是使用中序遍历树,比较小的结点先访问,最后将所有结点连接起来。 * 在将二元查找树转换...
(1)编写 AVL树判别程序,并判别一个二元查找树是否为 AVL树。二元查找树用其先序遍历结果表示,如:5,2,1,3,7,8。 (2)实现 AVL树的 ADT,包括其上的基本操作:结点的加入和删除;另外包括将一般二元查找树...
二元查找树是一种特殊的二元树,对于树中的每一个节点,它的左子树中所有元素的值均小于该节点的值,其右子树中所有元素的值均大于该节点的值。这种特性使得二元查找树在查找元素时具有较高的效率。 2. 二元查找树...
1. **定义变量**:设nL为左子树中的内节点数量,nR为右子树中的内节点数量,那么整个二叉树的内节点数量n可以表示为n = nL + nR + 1(根节点计入内节点)。 2. **外部节点计数**:设xL为左子树中的外部节点数量,xR...
其中一道具体的题目是将二元查找树转换为排序的双向链表。 首先,我们需要了解二元查找树(Binary Search Tree, BST)。二元查找树是一种特殊的二叉树,其特性是每个节点的左子树上的所有节点的值都小于该节点,而...
AVL树是一种自平衡二叉查找树(Binary Search Tree, BST),由Georgy Adelson-Velsky和Landis在1962年提出,因此得名AVL树。在AVL树中,任何节点的两个子树的高度最大差别不超过1,这确保了树的平衡性,从而保证了...
这个问题提出了一个算法挑战,即如何在不创建新节点的情况下,仅通过修改树中节点的指针,将二元查找树转换成一个排序的双向链表。有以下两种常见的递归策略: a. **思路一:自底向上,逐层处理**: - 首先处理左...
本题目的核心是将一个二元查找树转换成一个排序的双向链表,这涉及到对树结构的深入理解和递归或迭代的算法设计。 1. **二元查找树**: - 二元查找树是一种特殊的树结构,其中每个节点包含一个键、关联的值、左子...
二元查找树是一种特殊的树状数据结构,它的每个结点都含有一个关键字(Key),左子树中的关键字都小于根结点的关键字,右子树中的关键字都大于根结点的关键字。这使得二元查找树可以快速地查找、插入、删除关键字。 ...