二叉搜尋樹(二叉排序樹)

2021-09-29 17:23:57 字數 1439 閱讀 5390

全部資料結構、演算法及應用課內模板:

二叉搜尋樹(二叉排序樹)(binary search tree)(bst)

二叉搜尋樹很簡單,就是左子樹的所有結點的鍵值小於根結點,右子樹的所有結點的鍵值大於根結點

這樣就能使插入與搜尋達到log級別

非常簡單

稍微說一說刪除吧

刪除分兩類:合併刪除和複製刪除

1、合併刪除:把當前結點刪掉,左子樹右子樹對接到一起,於是有兩種對接想法

①左子樹挪到被刪結點處,右子樹接到左子樹中最大(最右)結點的右側(教材**,常用)

②右子樹挪到被刪結點處,左子樹接到右子樹中最小(最左)結點的左側

2、複製刪除:

①將左子樹中最大(最右)結點的值賦給被刪除結點,並把這個最大結點刪除,這個最大結點刪除起來就會方便許多,因為該結點必然沒有右兒子,於是只需要將左兒子挪到這個結點處即可,但寫的時候要注意細節,上述情況是最大結點的父結點的右 指向他的左兒子,如果這個結點的父結點恰好是被刪除結點,那麼接兒子的時候注意是左接他的左兒子(教材**,常用)

②將右子樹中最小(最左)結點的值賦給被刪除結點,並把這個最小結點刪除,具體細節可仿上,略

ps:不管是合併刪除還是複製刪除,待刪除結點只有乙個子樹的話,就直接挪過去就好,左右子樹都有再用上述手段

再就是刪除的時候要記得刪根特判。

二叉搜尋樹模板如下:(刪除取常用方法)

template class node

node(const t& x):x(x),l(0),r(0){}

node(const t& x, node*l, node*r):x(x),l(l),r(r){}

};template class binarysearchtree

void insert(const t& x)

if(!root) root=new node(x);

else if (x>pre->x) pre->r=new node(x);

else pre->l=new node(x);

} node* search(t x)

return cur;

} void delete_copy(t x)

if(!p) return;

tmp=p;

if(!(p->r))

else if(!(p->l))

else

p->x=tmp->x;

if(pre==p) p->l=tmp->l;

else pre->r=tmp->l;

} delete tmp;

} void delete_merge(t x)

if(!p) return;

if(!(p->r))

else if(!(p->l))

else

delete tmp;

}};

二叉搜尋樹(二叉排序樹)

描述 判斷兩序列是否為同一二叉搜尋樹序列 題目類別 樹 難度 中級 執行時間限制 10sec 記憶體限制 128mbyte 階段 入職前練習 輸入 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒有重複數字,根據...

二叉排序樹 二叉搜尋樹

bstree bst.h pragma once template 友元類宣告 class bstree 友元類宣告 templateclass bstnode 自定義的結點型別及特徵 bstnode type d,bstnode left null,bstnode right null 初始化 d...

二叉排序樹 二叉搜尋樹 二叉查詢樹

特點 結構體定義struct node 建樹 建二叉排序樹 void create node root,int t else if t root data create root lc,t else create root rc,t 前序遍歷 層序 字典序 int flag int pre 1001...