• 创建二叉树


    from nuanyangyang大神。。

    你需要一个领域专门语言(DSL)

     
    erchashu = (
            (
                (
                    (),
                    1,()
                    ),
                2,
                (
                    (),
                    3,
                    ())
                ),
            4,
            (
                (
                    (
                        (),
                        5,
                        (
                            (),
                            6,
                            ()
                            ),
                        ),
                    7,
                    (
                        (
                            (),
                            8,
                            ()
                            ),
                        9,
                        (
                            (),
                            10,
                            ()
                            )
                        )
                    )
                )
            )
     
    def inorder(tree):
        if tree == ():
            return
        else:
            l, m, r = tree
            inorder(l)
            print(m)
            inorder(r)
     
    inorder(erchashu)
    

      Python语言。我用空元组,即“()”表示叶子节点,用三元组(l, m, r)表示分支节点。数据存储在分支节点上,叶子节点都是空的。这样,空树就表示为(),只有根的树表示为((), 42, ()),其中42可以换成随便什么数据。于是,可以用这种方法组合出比较复杂的树,比如:
    (  ((),1,()),     2,      ((),3,()))
    这就是一个有3个节点的树。

    struct Node {
        Node* left;
        int data;
        Node* right;
    };
    

      然后创建两个函数来构造它们:

     
    // 用br创建分支节点,带数据
    Node* br(Node *left, int data, Node *right) {
        Node *n = new Branch();
        n->left = left;
        n->data = data;
        n->right = right;
        return n;
    }
     
    // 用lf创建叶子节点,没有数据
    Node* lf() {
        return nullptr;
    }
    

      那么同样的树可以写成:

     
    Node *root = br(  br(lf(),1,lf()),     2,      br(lf(),3,lf()));
    

      如果这个还麻烦,可以加一个创建“只有数据没有孩子的分支节点”:

     
    Node* bs(int data) {
        return br(nullptr, data, nullptr);
    }
     
    Node *root = br( bs(1), 2, bs(3));
    

      还嫌麻烦的话,可以把bs改名叫br,反正C++允许函数名重载。

    其实不管怎么样,树的每个节点都要创建。麻烦的只是表达方式。有一个好的语言,就会很简单。

     

     

     

     

  • 相关阅读:
    Microsoft Office MIME Types
    启动mongodb
    学习Hbase API的一个视频
    报错:Hive Runtime Error while processing row
    821. Shortest Distance to a Character
    1171. Remove Zero Sum Consecutive Nodes from Linked List
    190. Reverse Bits
    Rust--如何实现内存安全的?
    Rust -- as_ref与borrow的区别
    653. Two Sum IV
  • 原文地址:https://www.cnblogs.com/xiongji/p/5028824.html
Copyright © 2020-2023  润新知