创建二叉树

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++允许函数名重载。

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

 

 

 

 

posted @ 2015-12-08 13:31  我就是熊吉  阅读(343)  评论(0编辑  收藏  举报