从预序遍历迭代(不是递归)构造二叉搜索树

Construction of Binary Search Tree from preorder traversal iteratively (not recursion)

本文关键字:搜索树 递归 遍历 迭代      更新时间:2023-10-16

以下是将二叉搜索树的预序遍历转换为原始树的代码。

下面的代码采用一个整数数组,这些整数表示二叉搜索树的预序遍历。返回构造树的根。

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/

我无法理解此代码。谁能帮我理解以下内容:

  1. 在任何给定的迭代中,堆栈中存储的值与当前值相关 pre[i]

  2. 是否有其他迭代方法可以从给定的预序遍历构造 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;
}