018给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点“(keep it up)
2014-09-03 01:04
393 查看
给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点(即中序遍历后它的后继结点),
其中每个结点都有指向其父亲的链接。
这个题本质就是线索化二叉树时找后继结点的题。找后继结点存在两种情况:
1 如果当前结点有右孩子,则后继结点为右孩子的最左结点
2 如果没有右孩子,
A 当前结点为父结点的左孩子,则父结点就是后继结点
B 当前结点为父结点的右孩子,则向父结点找,直到当前结点不是父结点的右孩子终止,此时
父节点就是后继结点
代码:
struct TreeNode
{
int data;
TreeNode* leftChild;
TreeNode* rightChild;
TreeNode* parent;
};
TreeNode* findContinue(const TreeNode* vNode)
{
if (vNode == NULL) return NULL;
if (vNode->rightChild != NULL)
{
TreeNode* Tmp = vNode->rightChild;
while (Tmp->leftChild != NULL)
{
Tmp = Tmp->leftChild;
}
return Tmp;
}
TreeNode* Cur = vNode;
TreeNode* pParent = Cur->parent;
while (pParent != NULL && pParent->rightChild == Cur)
{
Cur = pParent;
pParent = pParent->rightChild;
}
return pParent;
}
其中每个结点都有指向其父亲的链接。
这个题本质就是线索化二叉树时找后继结点的题。找后继结点存在两种情况:
1 如果当前结点有右孩子,则后继结点为右孩子的最左结点
2 如果没有右孩子,
A 当前结点为父结点的左孩子,则父结点就是后继结点
B 当前结点为父结点的右孩子,则向父结点找,直到当前结点不是父结点的右孩子终止,此时
父节点就是后继结点
代码:
struct TreeNode
{
int data;
TreeNode* leftChild;
TreeNode* rightChild;
TreeNode* parent;
};
TreeNode* findContinue(const TreeNode* vNode)
{
if (vNode == NULL) return NULL;
if (vNode->rightChild != NULL)
{
TreeNode* Tmp = vNode->rightChild;
while (Tmp->leftChild != NULL)
{
Tmp = Tmp->leftChild;
}
return Tmp;
}
TreeNode* Cur = vNode;
TreeNode* pParent = Cur->parent;
while (pParent != NULL && pParent->rightChild == Cur)
{
Cur = pParent;
pParent = pParent->rightChild;
}
return pParent;
}
相关文章推荐
- 010给定一个循环链表,实现一个算法返回这个环的开始结点 (keep it up)
- 查找二叉查找树的任意给定结点的“下一个”结点
- 设计一个算法,找出二叉查找树中指定结点的“下一个“结点(也即中序后继)。可以假定每个结点都含有指向父结点的连接。
- 查找二叉查找树的任意给定结点的“下一个”结点
- 给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 给定一个有环链表,实现一个算法返回环路的开头结点
- 【Java】给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 给定一个有环链表,实现一个算法返回环路的开头结点
- 二叉查找树(4) - 中序查找一个给定值的前驱以及后继
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回
- 设计一个算法,找出二叉树中某两个结点的第一个公共祖先.。不得将额外的结点存储在另外的数据结构中。注意:这不一定是二叉查找树。
- 有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定二叉树的根结点root,请返回打印结果,
- 009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回
- PTA 求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 【Java】给定有向图,设计一个算法,找出两个结点之间是否存在一条路径
- 【Java】给定一个有环链表,实现算法返回环路的开头结点
- 设计一个程序,从键盘上输入若干字符串,利用算法库中的查找函数对给定的字符串进行查找,将查找后的结果输出
- 给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表