《算法导论》第12章 二叉查找树 (1)遍历

二叉查找树的效率


在二叉查找树中执行的基本操作的时间与树的高度成正比。最坏情况,
树的高度是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; } }

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/htc-javaMe/archive/2012/03/24/2562140.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞