返回信息流一个节点一个节点的建 再挂上左右孩子
很麻烦的感觉
这是一条镜像帖。来源:北邮人论坛 / cpp / #89618同步于 2015/12/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
有嘛方法快速建二叉树 ?
tycoon0
2015/12/2镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这个得是完全二叉树吧
【 在 chenxiansf 的大作中提到: 】
: 用数组?
: 每个节点的左孩子下标都是当前下标的两倍,右孩子下标都是当前下标的两倍加1?
不是啊,把普通二叉树当成满二叉树来分配空间,然后没有的结点空着预留的空间就行
【 在 xiaobing307 的大作中提到: 】
: 这个得是完全二叉树吧
你需要一个领域专门语言(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)
【 在 nuanyangyang 的大作中提到: 】
: 你需要一个领域专门语言(DSL)
: [code=python]
: erchashu = (
: ...................
啥(四声),啥(四声),这写的都是啥(四声)
【 在 june0334 的大作中提到: 】
: 啥(四声),啥(四声),这写的都是啥(四声)
Python语言。我用空元组,即“()”表示叶子节点,用三元组(l, m, r)表示分支节点。数据存储在分支节点上,叶子节点都是空的。这样,空树就表示为(),只有根的树表示为((), 42, ()),其中42可以换成随便什么数据。于是,可以用这种方法组合出比较复杂的树,比如:
( ((),1,()), 2, ((),3,()))
这就是一个有3个节点的树。
其实用C++也可以。比如定义一个结构:
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++允许函数名重载。
其实不管怎么样,树的每个节点都要创建。麻烦的只是表达方式。有一个好的语言,就会很简单。
雾草 学习了
【 在 nuanyangyang 的大作中提到: 】
:
: Python语言。我用空元组,即“()”表示叶子节点,用三元组(l, m, r)表示分支节点。数据存储在分支节点上,叶子节点都是空的。这样,空树就表示为(),只有根的树表示为((), 42, ()),其中42可以换成随便什么数据。于是,可以用这种方法组合出比较复杂的树,比如:
: ( ((),1,()), 2, ((),3,()))
: ...................