二叉搜尋樹 增刪查

2021-08-03 02:04:44 字數 4265 閱讀 9753

性質

-每個節點的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...