从预序遍历迭代(不是递归)构造二叉搜索树
Construction of Binary Search Tree from preorder traversal iteratively (not recursion)
以下是将二叉搜索树的预序遍历转换为原始树的代码。
下面的代码采用一个整数数组,这些整数表示二叉搜索树的预序遍历。返回构造树的根。
struct Node* constructTree(int pre[], int size)
{
stack<struct Node* > s;
int i;
struct Node* root=newNode(pre[0]);
struct Node* temp;
struct Node* top_node;
s.push(root);
for(i=1;i<size;i++)
{
temp=NULL;
while(!s.empty()&&pre[i]>(s.top()->data))
{
temp=s.top();
s.pop();
}
if(temp==NULL)
{
top_node=s.top();
top_node->left=newNode(pre[i]);
s.push(top_node->left);
}else
{
temp->right=newNode(pre[i]);
s.push(temp->right);
}
}
return root;
}
来源:http://www.geeksforgeeks.org/construct-bst-from-given-preorder-traversal-set-2/
我无法理解此代码。谁能帮我理解以下内容:
在任何给定的迭代中,堆栈中存储的值与当前值相关
pre[i]
是否有其他迭代方法可以从给定的预序遍历构造 BST?
谢谢。
在构造包含pre[i]
的节点的迭代之后,堆栈在顶部包含该节点,其最叶子到最根的祖先(只有一个子节点)从上到下存储。
检查这是否有效:
public:
TreeNode* bstFromPreorder(vector<int>& preorder) {
TreeNode *root = new TreeNode(preorder[0]);
stack<TreeNode*> nodes;
nodes.push(root);
for (int i = 1; i < preorder.size(); i++) {
TreeNode *temp = new TreeNode(preorder[i]);
if (temp->val < nodes.top()->val)
nodes.top()->left = temp;
else {
TreeNode *prev;
while (!nodes.empty() && nodes.top()->val < temp->val) {
prev = nodes.top();
nodes.pop();
}
prev->right = temp;
}
nodes.push(temp);
}
return root;
}
相关文章:
- 在递归二叉搜索树中搜索
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 通过提升属性树(递归方式)发出 YAML 迭代
- 二叉树递归的高度
- 多态性抽象语法树(递归下降解析器):不可能
- 四叉树递归检索
- 函数结束后儿童节点的树递归C 缺失值
- C++二进制树递归析构函数问题
- 从C++中的二进制搜索树(递归)复制叶
- 通过类型C++ 的继承树递归导致此指针问题
- 二叉树递归插入方法不起作用
- 带有修剪搜索的递归回溯
- 将STL列表转换为二进制搜索树递归模板
- 二叉搜索树递归显示节点
- 二进制搜索树递归插入导致堆栈溢出,迭代插入不起作用
- 二叉搜索树递归插入
- 二叉树递归加法不能产生正确的结果
- 二叉搜索树递归删除
- 二进制搜索树递归析构函数
- 如何避免深树递归中的堆栈溢出