• 《算法导论》第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;
                   
         }
    }




  • 相关阅读:
    数组练习1
    学习进度04
    求一个数组的最大子数组之和02
    求一个数组的最大子数组之和01
    学习进度03
    四则运算的功能添加版02
    第二周学习进度
    Right-BICEP 测试四则运算程序
    实现四则运算的功能添加版01
    本周实验PSP0 过程文档
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157853.html
Copyright © 2020-2023  润新知