您的位置:首页 > 编程语言 > C语言/C++

关于二叉树的一些算法

2013-07-16 09:32 295 查看
我们可以使用先序遍历,中序遍历,后序遍历二叉树进行数据的访问:

我们可以使用这样的递归代码来做处理:

struct Node
{
int value;
Node* left;
Node* right;
}


我们使用先序遍历节点,代码如下:

void inorder_traverse(Node* node)
{
if(NULL != node->left)
{
inorder_traverse(node->left);
}
doSomething(node);
if(NULL != node->right)
{
inorder_traverse(node->right);
}
}


起始其他的遍历算法和这个算法法的代码结构基本一致,知识调整一下递归之后对于节点的数据的处理顺序就好了。
有时我们使用迭代器进行二叉树的处理,我们先使用一种非递归的方法进行二叉树的节点的访问:

void inorder_traverse_onorecursive(Node* node)
{
Stack stack;
do
{
while(NULL != node)
{
stack.push(node);
node = node->left;
}

do
{
Node* top = stack.top();
stack.pop();
doSomething(top);
if(NULL != top->right)
{
node = top->right;
break;
}
}while(!stack.empty());
}while(!stack.empty());
}

现在我们可以使用非递归的方法进行访问二叉树的节点了,接下来我们可以考虑使用迭代器来访问二叉树中的节点,我们尝试使用类的方法进行设计:
class Iterator
{
public:
Iterator();
~Iterator();
virtual Node* next() = 0;
};

//Next is implementation

class InorderIterator : public Iterator
{
public:
InorderIterator(Node* node)
{
Node * current = node;
while(NULL != current)
{
mStack.push(current);
current = current->left;
}
}

virtual Node* next()
{
if(mStack.empty())
{
return NULL;
}

Node* node = mStack.top();
mStack.pop();
if(NULL != top->right)
{
Node* current = top->right;
while(NULL != current)
{
mStack.push(current);
current = current->left;
}
}
return top;
}

private:
std::stack<Node*> mStack;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 二叉树 遍历