2016-07-07 15 views
6

मैं छोरों पर वापस गिरने के बिना निम्नलिखित वृक्ष संरचना पूंछ पुनरावर्ती पार करने के लिए करना चाहते हैं:पूंछ रिकर्सिव ट्री Traversal

const o = {x:0,c:[{x:1,c:[{x:2,c:[{x:3},{x:4,c:[{x:5}]},{x:6}]},{x:7},{x:8}]},{x:9}]}; 

     0 
    /\ 
     1 9 
    /| \ 
    2 7 8 
/| \ 
3 4 6 
    | 
    5 

वांछित परिणाम: /0/1/2/3/4/5/6/7/8/9

मुझे लगता है कि एक बंद करने की आवश्यकता है पूंछ रिकर्सन सक्षम करें। मैंने अब तक यह कोशिश की है:

const traverse = o => { 
    const nextDepth = (o, index, acc) => { 
    const nextBreadth =() => o["c"] && o["c"][index + 1] 
    ? nextDepth(o["c"][index + 1], index + 1, acc) 
    : acc; 

    acc = o["c"] 
    ? nextDepth(o["c"][0], index, acc + "/" + o["x"]) // not in tail pos 
    : acc + "/" + o["x"]; 

    return nextBreadth(); 
    }; 

    return nextDepth(o, 0, ""); 
}; 

traverse(o); // /0/1/2/3/4/5/7/9 

भाई बहन ठीक से नहीं चल रहे हैं। यह कैसे किया जा सकता है?

+0

http://codereview.stackexchange.com/questions/47932/recursion-vs-iteration-of-tree-structure –

+1

आप केवल tailrecursion का उपयोग कर एक पेड़ के पार नहीं कर सकते जब तक कि आप करना चाहते हैं मैन्युअल रूप से एक ढेर बनाए रखें। – Bergi

+1

आप इसे लूप के साथ कैसे लिखेंगे? पहले कोशिश करें, फिर लूप को एक tailrecursive समारोह में परिवर्तित करें। – Bergi

उत्तर

4

जैसा कि @ बर्गि ने लिखा है कि यदि आप मैन्युअल रूप से स्टैक को बनाए रखते हैं तो समाधान सरल है।

const o = {x:0,c:[{x:1,c:[{x:2,c:[{x:3},{x:4,c:[{x:5}]},{x:6}]},{x:7},{x:8}]},{x:9}]} 
 

 
const traverse = g => { 
 
    const dfs = (stack, head) => (head.c || []).concat(stack) 
 
    
 
    const loop = (acc, stack) => { 
 
    if (stack.length === 0) { 
 
    \t return acc 
 
    } 
 

 
    const [head, ...tail] = stack 
 
    return loop(`${acc}/${head.x}`, dfs(tail, head)) 
 
    } 
 
    
 
    return loop('', [g]) 
 
} 
 

 
console.log(traverse(o)) 
 
console.log(traverse(o) === '/0/1/2/3/4/5/6/7/8/9')

+0

बहुत अच्छा, पूर्ण पूंछ पुनरावर्ती समाधान, धन्यवाद! अपने खुद के ढेर को संभालना इतना कठिन प्रतीत नहीं होता है। – ftor

+1

एसओ पर बहुत अच्छे प्रश्न/उत्तर मैंने देखा है। – naomik

संबंधित मुद्दे