关于二叉树的一些算法

我们可以使用先序遍历,中序遍历,后序遍历二叉树进行数据的访问:

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

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++,遍历,二叉树)