一.定義
1.二叉查詢樹可以是一棵空樹;
2.左子樹所有結點的資料域均小於等於根結點,右子樹所有結點的資料域均大於等於根結點;
二.基本操作
1.查詢操作
void
search
(node* root,
int x)
if(x == root-
>data)
printf
("%d\n"
, root-
>id)
;else
if(x < root-
>data)
search
(root-
>lchild, x)
;else
search
(root-
>rchild, x)
;}
2.插入操作
void
insert
(node*
&root,
int x)
if(x == root-
>data)
return
;else
if(x < root-
>data)
insert
(root-
>lchild, x)
;else
insert
(root-
>rchild, x)
;}
3.二叉查詢樹的建立
node*
create
(int deta,
int n)
4.刪除
為了保證刪除後還是一顆二叉查詢樹,選擇被刪除元素的前驅或後繼結點,覆蓋被刪除元素,然後刪除原結點;
//找前驅結點:
node*
findmax
(node* root)
//找後繼結點:
node*
findmin
(node* root)
//刪除函式:
void
deletenode
(node*
&root,
int x)
else
}else
if(root-
>data > x)
deletenode
(root-
>lchild, x)
;else
deletenode
(root-
>rchild, x)
;}
三.二叉查詢樹的性質
對二叉查詢樹中序遍歷,結果是有序的;
四.題目
1.pat a1064
思路:如何用n個整數構建一顆完全二叉查詢樹:用乙個陣列(1~n)存放一顆完全二叉樹,相當於該二叉樹的層序遍歷;把該二叉樹中序遍歷,並且在中序遍歷的同時放入輸入的資料;
注意:input[i] 中 i 不能是1~n,只能從 0 開始,why?
**:
#include
#include
using
namespace std;
const
int maxn =
1010
;int n;
int j =0;
int input[maxn]
;int cbt[maxn]
;void
inorder
(int n)
intmain()
return0;
}
2.pat a1099
注意:對於中序遍歷,無論是二叉樹還是完全二叉樹,結束條件都是結點不存在(i == -1 / i >= n);
**:
#include
#include
#include
#include
using
namespace std;
const
int maxn =
110;
int n;
int index =0;
int input[maxn]
;vector<
int> ans;
struct node node[maxn]
;void
inorder
(int i)
void
bfs()}
intmain()
for(
int i =
0; i < n; i++
)scanf
("%d"
,&input[i]);
sort
(input, input + n)
;inorder(0
);bfs();
for(
int i =
0; i < n; i++
)return0;
}
3.pat a1043
搞不懂它怎麼 insert 的……
演算法筆記9 4 二叉查詢樹 BST
search函式查詢二叉查詢樹中資料域為x的結點 插入乙個資料域為x的新結點 注意引數root要加引用 void insert node root,int x if x root data return 結點已經存在 不需要插入 二叉查詢樹元素一定不會重複 else if xdata insert ...
9 4 二叉查詢樹
唯一的坑在於 輸入中可能有重複元素,但是輸出的二叉樹遍歷序列中重複元素不用輸出。題目中沒說。中序遍歷 前序遍歷 後序遍歷才能唯一的確定一棵二叉樹 對 二叉排序樹 而言,相同元素的二叉排序樹中序遍歷一定相同,而不同元素二叉排序樹使用前序遍歷就可以發現不相同,所以只需要前序遍歷兩個二叉樹,比較一下就可以...
演算法 二叉查詢樹
二叉查詢樹 binary search tree 也稱有序二叉樹 ordered binary tree 排序二叉樹 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 1.若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2.若任意節點的右子樹不空,則右子...