2014-10-17 61 views
1

在我的程序中,我有一个用于二叉树的preOrder Iterator类。其中我试图在++运算符上实现一个运算符重载,以便从头到尾遍历树。但是我很困惑,因为二叉树可以同时具有左侧和右侧。我怎么知道开始的地方?它总是最左边的节点吗?为二叉树重载++运算符

这是我的代码结构:

家长二叉树:

/* Binary Tree */ 
class bin_tree 
{ 
public: 
    int data; 
    bin_tree *left; 
    bin_tree *right; 
    bin_tree *parent; 

    class preOrder_iterator; //child iterator class 
}; 

儿童迭代器类:

/* Iterator class -- inherits from parent */ 
class bin_tree::preOrder_iterator : public bin_tree 
{ 
     preOrder_iterator& operator ++() //++ prefix operator overload 
     { 

     } 
     preOrder_iterator begin(); 
     preOrder_iterator end(); 
}; 

一个我想出用什么开头和结尾,怎么我会实施这种超负荷?

+0

是你的问题“在二叉树中从节点到其后继节点的算法是什么”? – 2014-10-17 02:07:21

+0

一种,但我必须做一个操作符超载,我也不知道该怎么定义为开始。 – 2014-10-17 02:11:44

+1

要查找开始,请从根开始。继续沿左边的指针走,直到找到一个没有节点的节点为止。这是第一个节点。 – 2014-10-17 02:13:30

回答

1

如果这个节点有一个正确的子树,后继将是右子树中的第一个节点。因此,从那里到正确的子树,继续向左走,直到你不能再离开为止。该节点是继任者。

如果节点没有正确的子树,我们检查它的父节点。如果它没有父节点,也没有右节点树,它就是树中的最后一个节点。当我们到达父项时,有两种子情况:

  1. 我们是左节点。在这种情况下,我们的父母是我们的继任者。

  2. 我们是正确的节点。在这种情况下,我们遍历父节点的链,直到找到一个跟在我们后面的节点或找到没有父节点的节点。在前一种情况下,该节点是我们的继任者。在后一种情况下,我们是最后一个节点,没有后继者。