Hiển thị kết quả từ 1 đến 3 / 3
  1. #1
    Tham gia
    02-01-2003
    Bài viết
    159
    Like
    0
    Thanked 0 Times in 0 Posts

    Câu hỏi, cần giúp đỡ level order tranversal (breadth-first) code

    Đang đọc về binary tree, đến đoạn level order tranversal thì tắc. Hiểu nguyên tắc của nó, dùng thêm một cái queue, nhưng k tài nào implement cái queue đó được

    Code:
    // levelOrder : public
    void Tree::levelOrder()
    {
    	levelOrderStub(root);
    }
    // levelOrderStub : private
    void Tree::levelOrderStub(Node2 *rt)
    {
    	Tqueue q;
    	Node2 *p;
    
    	q.enqueue(rt);
    
    	while ( !q.empty() )
    	{
    		p = q.front();
    		q.dequeue();
    
    		cout<<p->getValue()<<' ';
    
    		if (p->getLeft() != NULL)
    			q.enqueue(p->getLeft() );
    		
    		if (p->getRight() != NULL)
    			q.enqueue(p->getRight() );
    
    	}
    	cout<<endl;
    }
    Còn cái queue implement như sau :
    Code:
    //queue.h
    class Tqueue {
    private :
    	int size;
    	int top;
    	Node2 *headPtr;
    	
    public:
    	Tqueue();
    	~Tqueue();
    	Node2 * front();
    	void enqueue(Node2 *);
    	void dequeue();
    	bool empty();
    	bool full();
    }; 
    
    //queue.cpp
    /**
     * class Tqueue implementation
     */
    #include "queue.h"
    
    
    Tqueue::Tqueue()
    {
    	size = 10;
    	top = 0;
    	headPtr = new Node2[size];
    }
    
    Tqueue::~Tqueue()
    {
    	for (int i=0;i<top;i++)
    		dequeue();
    }
    
    void Tqueue::enqueue(Node2 *tempPtr)
    {
    	if ( !full() )
    	{
    		headPtr[top]= Node2(tempPtr);
    		top++;
    	}
    	
    }
    
    void Tqueue::dequeue()
    {
    	if ( !empty() )
    	{
    		Node2 *tempPtr;
    		tempPtr = &headPtr[0];
    		delete tempPtr;
    		top--;
    		
    		for (int i=0;i<top;i++) //shift to head
    		{
    			headPtr[i] = headPtr[i+1];
    		}
    	}
    
    }
    
    Node2 * Tqueue::front()
    {
    	return &headPtr[0];
    }
    
    bool Tqueue::empty()
    {
    	return top==0;
    }
    
    bool Tqueue::full()
    {
    	return top == size;
    }
    Ngoài ra mọi người có thể chỉ ra hộ bug trong cái đống trên không ? Cám ơn mọi người nhiều !
    Quote Quote

  2. #2
    Tham gia
    03-01-2004
    Bài viết
    903
    Like
    0
    Thanked 11 Times in 7 Posts
    Tui thử coi nghen:

    1) Trong enqueue():
    headPtr[top]= *tempPtr;/* thay vì headPtr[top]= Node2(tempPtr); */

    2) Trong dequeue() -> bỏ 3 dòng:

    Node2 *tempPtr;
    tempPtr = &headPtr[0];
    delete tempPtr;

    3) Trong ~Tqueue:

    delete headPtr; /* thay vì for (int i=0;i<top;i++) dequeue(); */

    4) Cái này không phải là bug: trong front():
    return &headPtr[0];
    ==> có thể thay bằng return headPtr;

    Nói chung: mình gọi new bao nhiêu lần thì gọi delete chừng đó lần. Trong chương trình của bạn: bạn gọi new 1 lần trong Tqueue() thì bạn gọi delete 1 lần trong ~Tqueue. Các nút khác sẽ được new và delete do phần quản lý cấu trúc cây của bạn

    (có gì sai sót mong các bạn chỉ giúp, xin cám ơn trước)

  3. #3
    Tham gia
    02-01-2003
    Bài viết
    159
    Like
    0
    Thanked 0 Times in 0 Posts
    1 ) cái đấy mình định tạo ra một node mới rồi mới đính vào queue, hic sai luôn về ý tưởng của level order traversal

    2 ) vì cái ý tưởng ban đầu tạo ra node mới rồi cho vào queue đã sai nên cái dequeue sai hết luôn , hic

    3 + 4) cách bete đúng là đơn giản hơn hẳn, một phát ăn liền , cái mình luẩn quẩn quá

    Bài toán lvl order traversal mình đã giải được rồi, cám ơn bete giúp đỡ. Bài toán này mình cuối cùng giải bằng cách tạo ra một cái struct như sau
    Code:
    struct queueNode
    {
    	Node2 *ptr2TreeNode;
    	queueNode *ptr2NextQNode;
    };
    Không hiểu có cách nào hay hơn không :?:

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •