二叉搜尋樹(binarysearchtree):
1)特點:
1. 每個節點都有乙個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼互不相同。
2. 左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。
3. 右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼(key)。
4. 左右子樹都是二叉搜尋樹
2)插入操作:
bool insert(const k &key,const v &value)
node *cur = _root;
node *parent = null;
while(cur != null)
else if(cur->_key < key)
else
return false;
} node *node = new node(key,value);
if(key > parent->_key)
else
}
遞迴實現:
bool _insert_r(node* &root,const k &key,const v &value)
if(key > root->_key)
return _insert_r(root->_right,key,value);
if(key < root->_key)
return _insert_r(root->_left,key,value);
else
return false;
}
3)刪除操作:
bool remove(const k &key)
node *del = _root;
node *parent = _root;
while(del != null)
else if(del->_key < key)
else
break;
} if(del != null)
else
}else if(del->_right == null) //缺右子樹就用左子樹來補
else
}else //左右都不為空就與右子樹上中序遍歷的第乙個數交換
swap(del->_key,firstinorder->_key);
swap(del->_value,firstinorder->_value);
del = firstinorder;
if(parent->_left = del) //firstinorder的左數必為空
parent->_left = del->_right;
else
parent->_right = del->_right;
}delete del;
return true;
} else
}
遞迴實現:
bool _remove_r(node * &root,const k &key)
if(root->_key > key)
_remove_r(root->_left,key);
else if(root->_key < key)
_remove_r(root->_right,key);
else //root->_key == key
else if(del->_right == null) //缺右子樹就用左子樹來補
else //左右都不為空就與右子樹上中序遍歷的第乙個數交換
swap(root->_key,firstinorder->_key);
swap(root->_value,firstinorder->_value;
return _remove_r(root->_right,key);
} }
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
二叉搜尋樹 修剪二叉搜尋樹
第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...
二叉搜尋樹 二叉搜尋樹的刪除操作
如圖刪除 7,4,2直接刪除接可以 如圖 刪除6把7拉上去 如圖 刪除3 4沒有左孩子直接返回4 所以最後的結果只是4覆蓋3 上 class solution if key root.val else if key root.val else else if root.right null else...