二叉查找树的效率




在二叉查找树中执行的基本操作的时间与树的高度成正比。最坏情况,


树的高度是N,像链表一样,而较好情况高度是lgN。因此,树的高度是关键。


下一章将要学习的红黑树是对二叉查找树的改进,通过保持树的高度从而


保证红黑树上的操作有很好的效率。






各种遍历算法




中序遍历算法:子树根的关键字在输出时介于左子树和右子树的关键字之间。


即按排列顺序输出树中的所有关键字。




相应的,前序遍历就是子树根的关键字在左右子树之前输出。


在后面的基数树中,前序遍历(而非中序遍历)是二进制串的排序输出。




用递归方式可以很轻松地实现二叉树的遍历。





// 包含卫星数据的二叉树结点定义
struct _BSTNode {
struct _BSTNode *parent, *left, *right;
int key;
char *value;
};

typedef struct _BSTNode BSTNode;

// 中序遍历
void bst_inorder_walk(BSTNode *node)
{
if (node != NULL) {
bst_inorder_walk(node->left);
printf("key: %d, val: %s\n", node->key, node->value);
bst_inorder_walk(node->right);
}
}




非递归实现中序遍历




沿着二叉树的最左结点遍历,逐个入栈,到最左结点后开始出栈。


打印弹出栈的结点的值,并以该结点的右孩子为根结点,继续沿其最左结点处理。





void bst_inorder_walk(BSTNode *node)
{
BSTNode *stack[20];
int top = 0;

while (node || top != 0) {
// Push most-left children to stack
while (node) {
stack[top++] = node;
node = node->left;
}

// Print and continue to handle right child
node = stack[--top];
printf("%d, %s\n", node->key, node->value);
node = node->right;

}
}