关于二叉树的一些算法
2013-07-16 09:32
295 查看
我们可以使用先序遍历,中序遍历,后序遍历二叉树进行数据的访问:
我们可以使用这样的递归代码来做处理:
我们使用先序遍历节点,代码如下:
起始其他的遍历算法和这个算法法的代码结构基本一致,知识调整一下递归之后对于节点的数据的处理顺序就好了。
有时我们使用迭代器进行二叉树的处理,我们先使用一种非递归的方法进行二叉树的节点的访问:
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;
};
我们可以使用这样的递归代码来做处理:
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;
};
相关文章推荐
- 关于二叉树一些算法
- 一些关于图论和二叉树的
- 关于最大流 Dinic 算法的一些理解。
- 关于树的一些算法操作包含树的非递归遍历(c源代码)
- 关于算法的一些想法
- 关于算法的一些想法
- 关于算法的一些想法
- 以下是computer vision:algorithm and application计算机视觉算法与应用这本书中附录里关于计算机视觉的一些测试数据集和源码站点,我整理了下,加了点中文注解
- 关于Leetcode上二叉树的算法总结
- 关于最近做的一些有关 tarjan 类型的题目以及解析汇总(同时包括了点2-SAT、topo之类的算法)
- 李政軒Cheng-Hsuan Li的关于机器学习一些算法的中文视频教程
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 关于算法的一些资料
- 关于数值方法的一些算法解析(2)
- 关于人像美容之祛痘祛斑算法的一些尝试。
- 关于Retinex图像增强算法的一些新学习
- 关于Linux内核的一些算法
- 以下是关于二叉树操作的11个简单算法
- 视频会议中关于混音算法的一些笔记
- 关于顺序表示的线性表一些算法的实现