性質
-每個節點的key值各不相同
-左子樹上所有節點的key值小於根結點
-右子樹上的所有節點key值大於根結點
-左右子樹都是二叉搜尋樹
insert插入
bool insert(const k& key)//非遞迴插入
node* cur = _root;
node*
parent
=null;
while (cur)
else
if (key <
parent
->_key)
else
}//cur找到null了,插入新節點
if (key <
parent
->_key)
else
return
true;
}
find查詢
bool find(const k& key)//非遞迴查詢
//非空樹
node* cur = _root:
while (cur)
else
if (key < cur->_key) //反之 左子樹
else
//找到了返回真
}return
false; //遍歷之後發現並不存在
}
remove刪除
bool remove(const k& key)//非遞迴刪除
node* cur = _root;
node*
parent
=null;
while (cur)
else
if (cur->_key < key)
else
//找到了 分三種情況
else
else
if (parent
->_right == cur)
delete cur;
return
true;}}
else
if(cur->_right ==
null)
else
if (parent
->_right == cur)
delete cur;
return
true;
}else
//cur左右兩個孩子均不為空
cur->_key = subleft->_key;
if (parent
->_left == subleft)
else
if (parent
->_right == subleft)
delete subleft;
return
true;}}
}return
false;
}
二叉搜尋樹的退化和缺陷
-如果插入的數接近有序或者基本有序時,會成為一條單向單一的樹,類似於鍊錶
例如:
這個時候它的時間複雜度為o(n),所以要考慮高度
附上詳細**
#pragma once
template
k>
struct
binarysearchtreenode
};template
k>
class
bstree
bstree(k* a, size_t n) //建構函式
}~bstree()
{}bool insert(const k& key)//非遞迴插入
node* cur = _root;
node* parent = null;
while (cur)
else
if (key < parent->_key)
else
}//cur找到null了,插入新節點
if (key < parent->_key)
else
return
true;
}bool find(const k& key)//非遞迴查詢
//非空樹
node* cur = _root:
while (cur)
else
if (key < cur->_key) //反之 左子樹
else
//找到了返回真
}return
false; //遍歷之後發現並不存在
}bool remove(const k& key)//非遞迴刪除
node* cur = _root;
node* parent = null;
while (cur)
else
if (cur->_key < key)
else
//找到了 分三種情況
else
else
if (parent->_right == cur)
delete cur;
return
true;}}
else
if(cur->_right == null)
else
if (parent->_right == cur)
delete cur;
return
true;
}else
//cur左右兩個孩子均不為空
cur->_key = subleft->_key;
if (parent->_left == subleft)
else
if (parent ->_right == subleft)
delete subleft;
return
true;}}
}return
false;
}//bool insert(const k& key) //遞迴插入
//// bool remover(const k& key) //遞迴刪除
//
void inorder()
protected:
bool _insertr(node*& root,const k& key)
else
else
}return
true;
}bool _remover(node*& root, const k& key)
else
if (root->_key > key)
else
if (root->_key < key)
else
//剛好根節點就是要刪除的節點,分三種情況
if (root->_right == null) //根節點右為空
else
if//根節點左右都不為空,找替代節點}}
}void _inorder(node* root)
_inorder(root->_left);
cout << root->_key << " ";
_inorder(root->_right);
}protected:
node* _root;
};void testbstree()
; bstreet1;
for (size_t i = 0; i < sizeof(a) / sizeof(a[0]); ++i)
t1.inorder();
t1.remove(1);
t1.inorder();
t1.remove(0);
t1.inorder();
t1.remove(9);
t1.inorder();
t1.remove(5);
t1.inorder();
t1.remove(2);
t1.inorder();
t1.remove(3);
t1.inorder();
t1.remove(4);
t1.inorder();
t1.remove(6);
t1.inorder();
t1.remove(7);
t1.inorder();
t1.remove(8);
t1.inorder();
}
二叉搜尋樹的增刪查改
在實際生產中,一棵二叉搜尋樹的平均深度是log n 所以通常是遞迴的編寫二叉樹的操作 不需要太擔心爆棧的問題。對二叉樹的所有操作,無非就是從根節點 左子樹 右子樹這三者中入手,分析基本的 可能的情況後,再遞迴的編寫相應的操作即可。我們的重點放在insert 操作和 delete 操作中。insert...
二叉搜尋樹的增刪改查
二叉搜尋樹 binary search tree 簡稱 bst,是一種特殊形式的二叉樹。二叉搜尋樹的的結構有兩種可能 對於二叉搜尋樹,需要掌握基本的操作 當要查詢目標值的節點時,我們可以根據二叉樹的結點資料值的有序性 左孩子 根結點 右孩子 根據以下思路進行查詢 簡單實現 返回以目標值結點為根結點的...
二叉查詢樹(增 刪 查)
原理 按照大的向右小的向左原則,沿著樹的根節點往下找,找到第乙個為空的節點或者節點的key和目標key相同時結束,前者插入,後者替換。description 插入節點 param key param value author wjc920 date 2018年6月26日 public void pu...