二叉搜尋樹

2021-10-23 03:43:25 字數 3317 閱讀 2520

一.概念

最優情況下,二叉搜尋樹為完全二叉樹,其平均比較次數為log2n,最差情況下二叉搜尋樹退化為為單邊樹,其平均比較次數為n/2。二叉搜尋樹又稱二叉排序樹,它可以是一棵空樹,也可以是具有下面一些性質的數

1.若左子樹不為空,則左子樹上的所有節點的值都小於根節點的值。

2.若右子數不為空,則右子樹上的所有節點的值都大於根節點的值。

3.左右子樹也分別為二叉搜尋樹。

二.二叉搜尋樹的查詢

若不為空,則判斷你所要查詢的值和根節點的值的大小關係。若大於根節點的值,則從右子樹開始查詢,若小於根節點的值,則從左子樹開始查詢

若為空,則返回。

pnode find

(const t &value)

else

if(cur->value > value)

else

}return cur;

}

三.二叉搜尋樹的插入

若為空,則直接插入

否則,先紮到合適的位置(滿足二叉搜尋樹的規則),然後開闢空間,然後插入

bool insert

(const t &value)

//:先搜尋

pnode cur = root;

pnode parent = nullptr;

while

(cur)

else

if(cur->value > value)

else

} cur = new node

(value)

;//:判斷節點位置

if(parent->value > value)

else

return true;

}

四.二叉搜尋樹的刪除

bool erase

(const t &value)

pnode cur = root;

pnode parent = nullptr;

while

(cur)

else

}//:判斷節點是否存在

if(cur == nullptr)

return false;

//:若為單邊樹

//:此節點沒有左孩子

if(cur->left == nullptr)

為葉子節點,2.只有右子數的非葉子節點

//:更新根節點

else

root = cur->right;

delete cur;

cur = nullptr;

}else

if(cur->right == nullptr)

else

parent->right = cur->left;

}else

root = cur->left;

delete cur;

cur = nullptr;

}//:若不是單邊樹,如果刪除的不是葉子節點,則應該找到他的左孩子的右孩子或者右孩子的左孩子,然後交換位置,再進行刪除

else

cur->value = next->value;

if(parent->left == next)

parent->left = next->left;

else

parent->right = next->left;

delete next;

next = nullptr;

}return true;

}

五,完整**

#define _crt_secure_no_warnings 1

#include

using namespace std;

template

struct bsnode};

template

class bstree

else

if(cur->value > value)

else

}return cur;

} bool insert

(const t &value)

//:先搜尋

pnode cur = root;

pnode parent = nullptr;

while

(cur)

else

if(cur->value > value)

else

} cur = new node

(value)

;//:判斷節點位置

if(parent->value > value)

else

return true;

} bool erase

(const t &value)

pnode cur = root;

pnode parent = nullptr;

while

(cur)

else

}//:判斷節點是否存在

if(cur == nullptr)

return false;

//:此節點沒有左孩子

if(cur->left == nullptr)

為葉子節點,2.只有右子數的非葉子節點

//:更新根節點

else

root = cur->right;

delete cur;

cur = nullptr;

}else

if(cur->right == nullptr)

else

parent->right = cur->left;

}else

root = cur->left;

delete cur;

cur = nullptr;

}else

cur->value = next->value;

if(parent->left == next)

parent->left = next->left;

else

parent->right = next->left;

delete next;

next = nullptr;

}return true;

}void

inorder

(pnode root)

}void

test1()

private:

pnode root = nullptr;};

void

test()

intmain()

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...