zoukankan      html  css  js  c++  java
  • 《算法导论》第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;
                   
         }
    }




  • 相关阅读:
    jquery 父、子页面之间页面元素的获取,方法的调用
    读excle
    dataTable写入数据库(大数据写入)
    经典类和新式类的区别
    重写父类方法
    封装redis
    继承
    私有方法
    优化MyDb

  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157853.html
Copyright © 2011-2022 走看看