Biz ön sipariş biliyorum in-düzen ve sonrası sipariş geçişleri. Ne algoritması BST yeniden olacak?
BST sipariş dolaşımları sonuçlarında {, post, ön} kullanarak yeniden inşa etmek için nasıl
O BST olduğundan, in-ordergelen sıralanabilir pre-orderveya post-order<1>. Aslında, her iki pre-orderya da post-ordersadece ihtiyaç vardır ....
<1> Eğer karşılaştırma işlevinin ne biliyorsanız
Dan pre-orderve in-orderbir ikili ağaç oluşturmak için
BT createBT(int* preOrder, int* inOrder, int len)
{
int i;
BT tree;
if(len <= 0)
return NULL;
tree = new BTNode;
t->data = *preOrder;
for(i = 0; i < len; i++)
if(*(inOrder + i) == *preOrder)
break;
tree->left = createBT(preOrder + 1, inOrder, i);
tree->right = createBT(preOrder + i + 1, inOrder + i + 1, len - i - 1);
return tree;
}
Bunun arkasındaki mantık:
Ön amacıyla, birinci düğüm köküdür. in-sırayla kök bulun. Sonra ağaç sol ve sağ ayrılabilir. yinelemeli yap.
Benzer post-orderve in-order.
Ben şahsen takip etmek Dante'nin cevabı biraz zor buldum. Ben çözümü üzerinden yoluma çalıştı ve burada yayınlanan benzer olduğu tespit http://geeksforgeeks.org/?p=6633
Karmaşıklık (N ^ 2 O'dur) oluşmaktadır.
İşte sonrası düzen geçişi kullanarak bir ağaç oluşturmak için başka bir yaklaşım: http://www.technicallyidle.com/2011/02/15/build-binary-search-tree-using-post-order-traversal-trace/
Bu yardımcı olur umarım
bir ikili ağacın ya ön sipariş yeniden inşası için + inorder veya postorder + inorder gereklidir. Zaten bir BST için belirttiği gibi ikisini de bize inorder verecek sıralama olarak ön sipariş vermek veya postorder kullanarak yeniden inşa edebilir.
Statik değişken kullanmadan ağacını yeniden @brainydexter tarafından verilen kod modifikasyonu olan aşağıdaki işlevi kullanabilirsiniz:
struct node* buildTree(char in[],char pre[], int inStrt, int inEnd,int preIndex){
// start index > end index..base condition return NULL.
if(inStrt > inEnd)
return NULL;
// build the current node with the data at pre[preIndex].
struct node *tNode = newNode(pre[preIndex]);
// if all nodes are constructed return.
if(inStrt == inEnd)
return tNode;
// Else find the index of this node in Inorder traversal
int inIndex = search(in, inStrt, inEnd, tNode->data);
// Using index in Inorder traversal, construct left and right subtress
tNode->left = buildTree(in, pre, inStrt, inIndex-1,preIndex+1);
tNode->right = buildTree(in, pre, inIndex+1, inEnd,preIndex+inIndex+1);
return tNode;
}
İşte Yakut özyinelemeli çözümdür
def rebuild(preorder, inorder)
root = preorder.first
root_inorder = inorder.index root
return root unless root_inorder
root.left = rebuild(preorder[1, root_inorder], inorder[0...root_inorder])
root.right = rebuild(preorder[root_inorder+1..-1], inorder[root_inorder+1..-1])
root
end
Ve bir örnek
class Node
attr_reader :val
attr_accessor :left, :right
def initialize(val)
@val = val
end
def ==(node)
node.val == val
end
def inspect
"val: #{val}, left: #{left && left.val || "-"}, right: #{right && right.val || "-"}"
end
end
inorder = [4, 7, 2, 5, 1, 3, 8, 6, 9].map{|v| Node.new v }
preorder = [1, 2, 4, 7, 5, 3, 6, 8, 9].map{|v| Node.new v }
tree = rebuild(preorder, inorder)
tree
# val: 1, left: 2, right: 3
tree.left
# val: 2, left: 4, right: 5
tree.left.left
# val: 4, left: -, right: 7













