zoukankan      html  css  js  c++  java
  • 《算法导论》笔记 第10章 10.4 有根树的表示

    【笔记】

    用二叉数表示有多个子女的树:left[x]表示最左边的儿子,right[x]右边的兄弟。


    【练习】


    10.4-1 画出由下列域表示的、根在下标6处的二叉树。



    10.4-2 请写出一个O(n)时间的递归过程,在给定含n个结点的二叉树后,它可以将树中的每个结点的关键字输出来。

    void dfs(int x){
        printf("%d ",key[x]);
        if (l[x]) dfs(l[x]);
        if (r[x]) dfs(r[x]);
    }

    10.4-3 请写出一个O(n)时间的非递归过程,将给定的n结点二叉树中每个结点的关键字输出来。可以利用栈作为辅助数据结构。

    void output(int rt){
        stack<int>s;
        s.push(rt);
        while (!s.empty()) {
            int t = s.top();
            s.pop();
            printf("%d ",key[t]);
            if (r[t]) s.push(r[t]);
            if (l[t]) s.push(l[t]);
        }
    }

    10.4-4 对于任意的用左孩子、右兄弟表示存储的、含n个结点的有根树,写出一个O(n)时间过程来输出每个结点的关键字。

    void dfsTree(int rt) {
        printf("%d ",key[rt]);
        for (int i=l[rt];i!=0;i=r[i]) dfsTree(i);
    }

    *10.4-5 写出一个O(n)时间的非递归过程,输出给定的含n个结点的二叉树中每个结点的关键字。要求只能使用除树本身以外固定量的额外存储空间,而且在过程中不能修改该树,哪怕是暂时的。



    *10.4-6 在任意有根树的左孩子,右兄弟表示中,每个结点有三个指针:left-child,right-sibling和parent。从任意结点出发,都可以在常数时间内到达其父结点;可以在与子女数成线性关系的时间内到达其孩子。说明如何在每个结点内用两个指针和一个布尔值,在与子女数成线性关系的时间内到达其父亲或所有孩子。





  • 相关阅读:
    CCS过渡和动画
    使用Vue.prototype在vue中注册和使用全局变量
    vuex的使用
    Vue组件懒加载
    JavaScript 箭头函数(Lambda表达式)
    JS命名规范
    css命名规范
    vertical-align和line-height的理解及实例
    </2017><2018>
    给当当同学的random data
  • 原文地址:https://www.cnblogs.com/cyendra/p/3681502.html
Copyright © 2011-2022 走看看