二叉搜尋樹

2021-09-30 13:08:43 字數 3590 閱讀 4665

一、定義和性質:

1、定義

二叉查詢樹(binary search tree),又被稱為二叉搜尋樹。

它是特殊的二叉樹:

對於二叉樹,假設x為二叉樹中的任意乙個結點,x節點包含關鍵字key,節點x的key值記為key[x]。如果y是x的左子樹中的乙個結點,則key[y] <= key[x];如果y是x的右子樹的乙個結點,則key[y] >= key[x]。那麼,這棵樹就是二叉查詢樹。

2、性質

二叉搜尋樹或者是一棵空樹,或者是具有下列性質的二叉樹:

1、每個結點都有乙個作為搜尋依據的關鍵碼(key),所有結點的關鍵碼互不相同。

2、左子樹(如果非空)上所有結點的關鍵碼都小於根結點的關鍵碼。

3、右子樹(如果非空)上所有結點的關鍵碼都大於根結點的關鍵碼。

4、左子樹和右子樹也是二叉搜尋樹。

5、結點左子樹上所有關鍵碼小於結點關鍵碼;

6、右子樹上所有關鍵碼大於結點關鍵碼;

7、若從根結點到某個葉結點有一條路徑,路徑左邊的結點的關鍵碼不一定小於路徑上的結點的關鍵碼。

8、如果對一棵二叉搜尋樹進行中序遍歷,可以按從小到大的順序,將各結點關鍵碼排列起來,所以也稱二叉搜尋樹為二叉排序樹。

二、二叉搜尋樹的實現

#include 

using

namespace

std;

struct bst_node

;//中序遍歷,按順序輸出

void inorder_tree_walk(bst_node *x)

}//遞迴查詢

bst_node *d_tree_search(bst_node *x, int k)

//迭代查詢

bst_node *iterative_tree_search(bst_node *x, int k)

return x;

}//迭代法求最小值

bst_node *iterative_tree_minimum(bst_node *x)

//遞迴法求最小值

bst_node *d_tree_minimum(bst_node *x)

//迭代法求最大值

bst_node *iterative_tree_maximum(bst_node *x)

//遞迴法求最大值

bst_node *d_tree_maximum(bst_node *x)

bst_node *tree_successor(bst_node *root, int k)

return y;

}}bst_node *tree_predecessor(bst_node *root , int k)

return y;

}}//迭代法插入

bst_node *iterative_tree_insert(bst_node *root, int k)

z->parent = y;//將y作為z的雙親

if (y == null)//此時二叉樹為空

root = z;

else

if (z->key < y->key)//如果z關鍵字小於z的雙親y的關鍵字,則z作為y的左孩子

y->left = z; //否則作為右孩子

else

y->right = z;

return root;

}//遞迴法插入

bst_node *d_tree_insert(bst_node *root, int k)

else

//開始找要插入元素的位置

return root;

}//有陣列a建立二叉搜尋樹

bst_node *establish_tree(int *a, int length)

//一棵子樹替代另一棵子樹

void transplant(bst_node *root, bst_node *u, bst_node *v)

//刪除節點

bst_node *tree_delete(bst_node *root, int k)

transplant(root, z, y);//用y替代z,並更新y的左孩子

y->left = z->left;

y->left->parent = y;

}return root;

}int main()

; int length = sizeof(a) / sizeof(a[0]);

bst_node *root;

root = establish_tree(a, length);

cout

<< "中序遍歷輸出所有節點值:";

inorder_tree_walk(root);

cout

<< endl;

cout

<< "4的後繼是:"

<< tree_successor(root, 4)->key << endl;

cout

<< "7的前驅是:"

<< tree_predecessor(root, 7)->key << endl;

cout

<< "迭代法的最小值是:"

<< iterative_tree_minimum(root)->key << endl;

cout

<< "遞迴法的最小值是:"

<< d_tree_minimum(root)->key << endl;

cout

<< "迭代法的最大值是:"

<< iterative_tree_maximum(root)->key << endl;

cout

<< "遞迴法的最大值是:"

<< d_tree_maximum(root)->key << endl;

cout

<< "迭代法插入4:";

root = iterative_tree_insert(root, 4);

cout

<< "中序遍歷輸出所有節點值:";

inorder_tree_walk(root);

cout

<< endl;

cout

<< "遞迴法插入8:";

root = d_tree_insert(root, 8);

cout

<< "中序遍歷輸出所有節點值:";

inorder_tree_walk(root);

cout

<< endl;

cout

<< "刪除5:";

root = tree_delete(root, 5);

cout

<< "中序遍歷輸出所有節點值:";

inorder_tree_walk(root);

cout

<< endl;

system("pause");

return

0;}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...