Redian新闻
>
发现一个很恶心的基础问题
avatar
发现一个很恶心的基础问题# JobHunting - 待字闺中
x*w
1
delete node from BST.
不能直接copy value.
二爷来做一下吧...
avatar
a*n
2
void RemoveFromBST( BinaryTreeNode*& p, int key )
{
if( p )
{
if( key < p->m_Data )
{
RemoveFromBST( p->m_Left, key );
}
else if( key > p->m_Data )
{
RemoveFromBST( p->m_Right, key );
}
else
{
if( p->m_Right )
{
BinaryTreeNode* small = FindMinNode( p->m_Right );
p->m_Data = small->m_Data;
RemoveFromBST( p->m_Right, p->m_Data );
}
else if( p->m_Left )
{
BinaryTreeNode* temp = p;
p = p->m_Left;
delete temp;
temp = NULL;
}
else
{
delete p;
p = NULL;
}
}
}
}
是这样吗?
avatar
g*s
3
很多很基本的text book题逻辑简单,但写起来真的很难直接bug free。
这个题就是之一把。。。。还有什么heapify, non-recursive traversal 之类的
avatar
a*n
4
是的,
否则也不要gdb了,写了就bug free.

【在 g*******s 的大作中提到】
: 很多很基本的text book题逻辑简单,但写起来真的很难直接bug free。
: 这个题就是之一把。。。。还有什么heapify, non-recursive traversal 之类的

avatar
x*w
5

一个node有parent指针,
原型是remove_node(NODE* root, NODE* pNode2Remove)

【在 a********n 的大作中提到】
: void RemoveFromBST( BinaryTreeNode*& p, int key )
: {
: if( p )
: {
: if( key < p->m_Data )
: {
: RemoveFromBST( p->m_Left, key );
: }
: else if( key > p->m_Data )
: {

avatar
p*2
6

有parent没有必要要root吧?

【在 x*********w 的大作中提到】
:
: 一个node有parent指针,
: 原型是remove_node(NODE* root, NODE* pNode2Remove)

avatar
l*8
7
我写了个平铺直叙版的,代码稍长。
假设BST里面没有重复value
TreeNode * deleteNode(TreeNode * root, int target) {
if (!root)
return NULL;
if (target < root->val) {
root->left = deleteNode(root->left, target);
return root;
}
if (target > root->val) {
root->right = deleteNode(root->right, target);
return root;
}
TreeNode * newRoot;
if (root->left == NULL) {
newRoot = root->right;
delete root;
return newRoot;
}
if (root->right == NULL) {
newRoot = root->left;
delete root;
return newRoot;
}
newRoot = root->right;
if (newRoot->left == NULL) {
newRoot->left = root->left;
delete root;
return newRoot;
}
TreeNode * parent = newRoot;
while(newRoot->left != NULL){
parent = newRoot;
newRoot = newRoot->left;
}
parent->left = newRoot->right;
newRoot->left = root->left;
newRoot->right = root->right;
delete root;
return newRoot;
}

【在 x*********w 的大作中提到】
: delete node from BST.
: 不能直接copy value.
: 二爷来做一下吧...

avatar
l*8
8
哦,原型是这样啊。刚才没看到

【在 x*********w 的大作中提到】
:
: 一个node有parent指针,
: 原型是remove_node(NODE* root, NODE* pNode2Remove)

avatar
x*w
9

不需要,你做做?

【在 p*****2 的大作中提到】
:
: 有parent没有必要要root吧?

avatar
p*2
10

把left和rightmerge一下,然后把结果覆盖自己就可以了。
因为有parent,所以可以很容易知道自己是parent的left还是right,set一下就可以了


【在 x*********w 的大作中提到】
:
: 不需要,你做做?

avatar
x*w
11

复杂度太大了吧,有标准算法

【在 p*****2 的大作中提到】
:
: 把left和rightmerge一下,然后把结果覆盖自己就可以了。
: 因为有parent,所以可以很容易知道自己是parent的left还是right,set一下就可以了
: 。

avatar
x*w
12
写了一个:
static public void transplant(NODE p1, NODE p2)
{
if (p1 == null || p2 == null || p1 == p2)
return;

p2.prt = p1.prt;
if (p1.prt != null)
{
if (p1 == p1.prt.lft)
p1.prt.lft = p2;
else
p1.prt.rgt = p2;
}

p2.prt = null;
}

static public NODE delete(NODE node)
{
if (null == node)
return null;

boolean bRoot = node.prt == null;
if (node.lft == null || node.rgt == null)
{
NODE tmp = node.lft == null ? node.rgt : node.lft;
transplant(node, tmp);

if (bRoot)
return tmp;
}
else
{
NODE p = node.rgt;
while (p.lft != null)
p = p.lft;

if (p.prt != node)
{
if (p.rgt != null)
p.rgt.prt = p.prt;

p.prt.lft = p.rgt;
p.rgt = node.rgt;
}

p.lft = node.lft;
node.lft.prt = p;

transplant(node, p);

if (bRoot)
return p;
}

return null;
}
avatar
p*2
13

O(n)复杂度。算大吗?

【在 x*********w 的大作中提到】
: 写了一个:
: static public void transplant(NODE p1, NODE p2)
: {
: if (p1 == null || p2 == null || p1 == p2)
: return;
:
: p2.prt = p1.prt;
: if (p1.prt != null)
: {
: if (p1 == p1.prt.lft)

avatar
p*2
14

你这个不是也没有root做输入参数吗?

【在 x*********w 的大作中提到】
: 写了一个:
: static public void transplant(NODE p1, NODE p2)
: {
: if (p1 == null || p2 == null || p1 == p2)
: return;
:
: p2.prt = p1.prt;
: if (p1.prt != null)
: {
: if (p1 == p1.prt.lft)

avatar
s*y
15
Should the following code:
p->m_Data = small->m_Data;
RemoveFromBST( p->m_Right, p->m_Data );
to be:
p->m_Data = small->m_Data;
RemoveFromBST( p->m_Right, small->m_Data );
?

【在 a********n 的大作中提到】
: void RemoveFromBST( BinaryTreeNode*& p, int key )
: {
: if( p )
: {
: if( key < p->m_Data )
: {
: RemoveFromBST( p->m_Left, key );
: }
: else if( key > p->m_Data )
: {

avatar
p*2
16
merge=(node1, node2)->
return node2 if !node1
return node1 if !node2
node1.right=merge(node1.right,node2)
return node1
deleteNode=(root, val)->
if(root.val==val)
root=merge(root.left,root.right)
else if(valroot.left=deleteNode(root.left,val)
else
root.right=deleteNode(root.right,val)
return root
avatar
x*w
17

我靠,你这个写的也太随便了,O(n)还想当的不平衡

【在 p*****2 的大作中提到】
: merge=(node1, node2)->
: return node2 if !node1
: return node1 if !node2
: node1.right=merge(node1.right,node2)
: return node1
: deleteNode=(root, val)->
: if(root.val==val)
: root=merge(root.left,root.right)
: else if(val: root.left=deleteNode(root.left,val)

avatar
p*2
18

本来就是BST,不是red-black吧?

【在 x*********w 的大作中提到】
:
: 我靠,你这个写的也太随便了,O(n)还想当的不平衡

avatar
d*x
19
前几天不是有人恶心过了吗

【在 x*********w 的大作中提到】
: delete node from BST.
: 不能直接copy value.
: 二爷来做一下吧...

avatar
d*x
20
heapify很好写
这个难写因为corner case多

【在 g*******s 的大作中提到】
: 很多很基本的text book题逻辑简单,但写起来真的很难直接bug free。
: 这个题就是之一把。。。。还有什么heapify, non-recursive traversal 之类的

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。