一、定義和性質:
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 解釋 輸入為 ...