根据给定的前序遍历构造 BST 集合 3(朴素方法)
原文:https://www . geesforgeks . org/construct-BST-from-给定-preorder-遍历-set-3-幼稚-method/
给定二叉查找树的前序遍历,构造 BST。 例如,如果给定的遍历是{10,5,1,7,40,50},那么输出应该是跟随树的根。
10
/ \
5 40
/ \ \
1 7 50
我们已经在之前的帖子中讨论了构建二叉查找树的方法。这里是另一种方法来构造二叉查找树当给定的前序遍历。
我们知道 BST 的有序遍历以非递减的方式给出元素。因此,我们可以对给定的前序遍历进行排序,以获得二叉查找树的有序遍历。
我们已经在这篇帖子中学习了当给定了前序和中序遍历时构造树的方法。我们现在将使用相同的方法来构建 BST。
C++
#include <bits/stdc++.h>
using namespace std;
// A BST node has data, pointer to left
// child and pointer to right child
struct Node {
int data;
Node *left, *right;
};
// A utility function to create new node
Node* getNode(int data)
{
Node* temp = new Node();
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
/* Recursive function to construct BST
Inorder traversal in[] and Preorder traversal
pre[]. Initial values of inStart and inEnd should be
0 and n -1.*/
Node* buildBTRec(int in[], int pre[], int inStart,
int inEnd, unordered_map<int,int>& m)
{
static int preIdx = 0;
if (inStart > inEnd)
return NULL;
// Pick current node from Preorder traversal
// using preIndex and increment preIndex
int curr = pre[preIdx];
++preIdx;
Node* temp = getNode(curr);
// If this node has no children then return
if (inStart == inEnd)
return temp;
// Else find the index of this node in
// inorder traversal
int idx = m[curr];
// Using this index construct left and right subtrees
temp->left = buildBTRec(in, pre, inStart, idx - 1, m);
temp->right = buildBTRec(in, pre, idx + 1, inEnd, m);
return temp;
}
// This function mainly creates a map to store
// the indices of all items so we can quickly
// access them later.
Node* buildBST(int pre[], int n)
{
// Copy pre[] to in[] and sort it
int in[n];
for (int i = 0; i < n; i++)
in[i] = pre[i];
sort(in, in + n);
unordered_map<int,int> m;
for(int i=0;i<n;i++)
{
m[in[i]] = i;
}
return buildBTRec(in, pre, 0, n-1,m);
}
// Inorder Traversal of tree
void inorderTraversal(Node* node)
{
if(node==NULL)
return ;
inorderTraversal(node->left);
cout << node->data << " ";
inorderTraversal(node->right);
}
// Driver Program
int main()
{
int pre[] = { 100, 20, 10, 30, 200, 150, 300 };
int n = sizeof(pre) / sizeof(pre[0]);
Node* root = buildBST(pre, n);
// Let's test the built tree by printing its
// Inorder traversal
cout << "Inorder traversal of the tree is \n";
inorderTraversal(root);
return 0;
}
Python 3
# A BST node has data, pointer to left
# child and pointer to right child
class Node:
def __init__(self, x):
self.data = x
self.left = None
self.right = None
# /* Recursive function to construct BST
# Inorder traversal in[] and Preorder traversal
# pre[]. Initial values of inStart and inEnd should be
# 0 and n -1.*/
def buildBTRec(inn, pre, inStart, inEnd):
global m, preIdx
if (inStart > inEnd):
return None
# Pick current node from Preorder traversal
# using preIndex and increment preIndex
curr = pre[preIdx]
preIdx += 1
temp = Node(curr)
# If this node has no children then return
if (inStart == inEnd):
return temp
# Else find the index of this node in
# inorder traversal
idx = m[curr]
# Using this index construct left and right subtrees
temp.left = buildBTRec(inn, pre, inStart, idx - 1)
temp.right = buildBTRec(inn, pre, idx + 1, inEnd)
return temp
# This function mainly creates a map to store
# the indices of all items so we can quickly
# access them later.
def buildBST(pre, n):
global m
# Copy pre[] to in[] and sort it
inn=[0 for i in range(n)]
for i in range(n):
inn[i] = pre[i]
inn = sorted(inn)
for i in range(n):
m[inn[i]] = i
return buildBTRec(inn, pre, 0, n - 1)
def inorderTraversal(root):
if (root == None):
return
inorderTraversal(root.left)
print(root.data, end = " ")
inorderTraversal(root.right)
# Driver Program
if __name__ == '__main__':
m,preIdx = {}, 0
pre = [100, 20, 10, 30, 200, 150, 300]
n = len(pre)
root = buildBST(pre, n)
# Let's test the built tree by printing its
# Inorder traversal
print("Inorder traversal of the tree is")
inorderTraversal(root)
# This code is contributed by mohit kumar 29
java 描述语言
<script>
// A BST node has data, pointer to left
// child and pointer to right child
class Node
{
constructor(data)
{
this.data = data;
this.left = this.right = null;
}
}
/* Recursive function to construct BST
Inorder traversal in[] and Preorder traversal
pre[]. Initial values of inStart and inEnd should be
0 and n -1.*/
function buildBTRec(In, pre, inStart, inEnd)
{
if (inStart > inEnd)
return null;
// Pick current node from Preorder traversal
// using preIndex and increment preIndex
let curr = pre[preIdx];
++preIdx;
let temp = new Node(curr);
// If this node has no children then return
if (inStart == inEnd)
return temp;
// Else find the index of this node in
// inorder traversal
let idx = m.get(curr);
// Using this index construct left and right subtrees
temp.left = buildBTRec(In, pre, inStart, idx - 1);
temp.right = buildBTRec(In, pre, idx + 1, inEnd);
return temp;
}
// This function mainly creates a map to store
// the indices of all items so we can quickly
// access them later.
function buildBST(pre, n)
{
// Copy pre[] to in[] and sort it
let In = new Array(n);
for(let i = 0; i < n; i++)
In[i] = pre[i];
In.sort(function(a, b){return a - b;});
for(let i = 0; i < n; i++)
m.set(In[i], i);
return buildBTRec(In, pre, 0, n - 1)
}
function inorderTraversal(root)
{
if (root == null)
return;
inorderTraversal(root.left);
document.write(root.data + " ");
inorderTraversal(root.right);
}
// Driver code
let m = new Map();
let preIdx = 0;
let pre = [ 100, 20, 10, 30, 200, 150, 300 ];
let n = pre.length;
let root = buildBST(pre, n);
// Let's test the built tree by printing its
// Inorder traversal
document.write("Inorder traversal of the tree is <br>");
inorderTraversal(root);
// This code is contributed by patel2127
</script>
Output:
Inorder traversal of the tree is
10 20 30 100 150 200 300
时间复杂度:排序需要 O(nlogn)时间,使用前序和中序遍历进行排序和构造需要线性时间。因此,上述解决方案的总时间复杂度为 0(nlogn)。 辅助空间: O(n)。
版权属于:月萌API www.moonapi.com,转载请注明出处