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;
                   
         }
    }




  • 相关阅读:
    Kafka Shell基本命令(包括topic的增删改查)
    thefuck的安装和使用
    Linux运维利器之ClusterShell
    MySQL数据库的10大经典错误案例
    Mysql 常用操作
    Git 忽略特定文件或文件夹
    为什么需要拷贝构造函数
    C语言编译过程
    设计模式之建造者模式
    设计模式之工厂/抽象工厂模式
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157853.html
Copyright © 2011-2022 走看看