创建二叉树
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++允许函数名重载。
其实不管怎么样,树的每个节点都要创建。麻烦的只是表达方式。有一个好的语言,就会很简单。