【发布时间】:2019-10-23 17:02:34
【问题描述】:
给定一个 BST 的前序遍历。我必须构造 BST。 我可以简单地通过创建一个空的BST,然后从第一个元素开始到最后一个元素将元素一个一个地插入到空BST中来从前序遍历构造BST吗?
例如,考虑以下 BST:-
10
/ \
5 40
/ \ \
1 7 50
它的前序遍历是:
10 5 1 7 40 50
通过创建一个空的 BST,然后从第一个元素开始在前序遍历中一个接一个地插入元素,可以得到确切的 BST,解释如下:
(empty tree)
插入前序遍历的第一个元素:10
10
插入前序遍历的第二个元素:5
10
/
5
同样,
10
/
5
/
1
10
/
5
/ \
1 7
10
/ \
5 40
/ \
1 7
10
/ \
5 40
/ \ \
1 7 50
在这里,我只是通过将前序遍历中的元素一个接一个地插入到一棵空树中来构造了确切的 BST。 这个算法在所有情况下都可以工作吗?有没有这个算法不能工作的情况?
void insertIntoTree(struct* Node,int val)
{
if(Node == NULL)
{
Node = createNewNode(val);
return;
}
if(val < Node->val)
insertIntoTree(Node->left,val);
else
insertIntoTree(Node->right,val);
}
int main()
{
int preorderlist[] = { 10,5,1,7,40,50};
for(int i=0;i <= preorderlist.size();i++)
{
insertIntoTree(TreeRoot,preorderlist[i]);
}
}
【问题讨论】:
-
不确定我是否理解这个问题。您所指的“所有案例”是什么?
-
@RobertBaron “将任意 BST 转换为预购形式,然后再转换回 BST,是否总是会产生与原始 BST 相同的结果?”与涉及 BST 的大多数事情一样,答案涉及递归。
-
您缺少子节点引用。仅创建一个新节点不会为您提供正确的 BST。您需要返回节点并相应地插入父级的左或右引用,因为当前作为不存在值的参数传递的左或右引用将为 NULL。
-
@RobertBaron 有没有上述算法行不通的情况?
标签: algorithm binary-search-tree