कैसे BST {, पूर्व में, पोस्ट} का उपयोग क्रम traversals परिणाम के पुनर्निर्माण के लिए

वोट
3

हम प्री-ऑर्डर जानते हैं, इन-आदेश और बाद के क्रम traversals। क्या एल्गोरिथ्म BST फिर से संगठित करेंगे?

20/03/2011 को 08:59
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
12

क्योंकि यह BST है, in-orderसे हल हो सकते हैं pre-orderया post-order<1>। वास्तव में, या तो pre-orderया post-orderकेवल जरूरत है ....

<1> क्या आप जानते तुलना समारोह है क्या हुआ अगर


से pre-orderऔर in-order, एक द्विआधारी पेड़ के निर्माण के लिए

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;
}

इस के पीछे तर्क:

प्री-ऑर्डर में, पहली नोड जड़ है। इन-क्रम में जड़ का पता लगाएं। फिर पेड़ छोड़ दिया और सही में विभाजित किया जा सकता है। यह रिकर्सिवली करो।

के लिए इसी तरह post-orderऔर in-order

20/03/2011 को 09:50
का स्रोत उपयोगकर्ता

वोट
0

मैं व्यक्तिगत रूप से दांते की जवाब एक छोटे से पालन करने के लिए मुश्किल पाया। मैं समाधान के माध्यम से अपने रास्ते काम किया है और पाया है कि यह एक यहां पोस्ट के समान होने की http://geeksforgeeks.org/?p=6633

जटिलता हे (एन ^ 2) है।

यहाँ के बाद आदेश ट्रावर्सल का उपयोग कर एक पेड़ के निर्माण के लिए एक और तरीका है: http://www.technicallyidle.com/2011/02/15/build-binary-search-tree-using-post-order-traversal-trace/

उम्मीद है की यह मदद करेगा

22/03/2011 को 04:29
का स्रोत उपयोगकर्ता

वोट
0

एक द्विआधारी पेड़ या तो अग्रिम आदेश के पुनर्निर्माण के लिए + inorder या क्रंमोत्तर + inorder की जरूरत है। जैसा कि पहले ही एक BST के लिए कहा हम के रूप में छँटाई उनमें से या तो हमें inorder दे देंगे या तो अग्रिम आदेश या क्रंमोत्तर का उपयोग कर फिर से संगठित कर सकते हैं।

आप नीचे दिए गए समारोह जो @brainydexter द्वारा दिए गए स्थिर चर का उपयोग किए बिना पेड़ फिर से संगठित करने कोड के संशोधन का उपयोग कर सकते हैं:

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;
}
22/03/2011 को 06:01
का स्रोत उपयोगकर्ता

वोट
0

यहाँ एक रूबी पुनरावर्ती समाधान है

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

और एक उदाहरण

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
28/06/2015 को 09:03
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more