二叉查找树的定义、构造及其遍历
定义
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
构造
假设我们要为数组 a[] = {10 , 5 , 15 , 6 , 4 , 16 }构建一个二叉排序树,我们按顺序逐个插入元素
前驱节点val值小于该节点val值并且值最大的节点
后继节点val值大于该节点val值并且值最小的节点
遍历
查找指定元素的节点(While循环):
判断当前结点是否为空指针,不是空指针进入
key直接和当前结点value相等,return当前结点
key大于当前结点value,将右子节点赋予当前结点
key小于当前结点value,将左子节点赋予当前结点
直到key等于当前结点或者当前结点为空停止while循环
// NOIP2013普及组初赛
#include <iostream>
using namespace std;
const int SIZE = 100;
const int INFINITE = 1000000;
struct node{
int left_child, right_child, value;
}a[SIZE];
int is_bst( int root, int lower_bound, int upper_bound ){
int cur;
if (root == 0) return 1;
cur = a[root].value;
if ((cur > lower_bound) && (cur < upper_bound) &&
(is_bst(a[root].left_child, lower_bound, cur) == 1) &&
(is_bst(a[root].right_child, cur, upper_bound) == 1) )
return 1;
return 0;
}
int main()
{
int i, n;
cin >> n;
for (i = 1; i <= n; i++)
cin >> a[i].value >> a[i].left_child >> a[i].right_child;
cout << is_bst(1, -INFINITE, INFINITE) << endl;
return 0;
}
例题
例题,FBI树(fbi)
void dfs(int l, int r)
{
//边界
//子问题
int len = (r - l) / 2;
dfs(l, l + len);
dfs(l + len + 1, r);
//按题意模拟操作
}
例题,对称二叉树(tree_c)
//思路1,从s[1]开始,两两为一单位,要么都是#,要么都不是#
//思路2,根据左儿子和右儿子的位置,去判断左右儿子要么同时为#,要么同时不是#
//两个思路,都需要在读入的字符串后面加上一个#,避免最后一个叶子结点没有兄弟的情况