前序遍历
算法描述
- 将根节点赋值给暂存结点n,并创建栈命名为s
- 判断栈和n是否不为空,如果不为空重复执行以下操作
- 判断n是否为空如果不为空重复执行以下操作
- 读出当前结点的值
- 将n压入stack
- 将n左孩子赋值给n
- 判断如果stack不为空则从中push出一个结点将其右孩子赋值给n
实现代码
class Node <T>{
Node left
Node right
T element
}
Stack<String> stack = new Stack()
while(n != null || !stack.empty())
{
while(n != null)
{
System.out.print(n.element + " ")
stack.push(n)
n = n.left
}
if(!stack.empty())
{
n = stack.pop()
n = n.right
}
}
后续遍历
算法描述
- 将根节点赋值给暂存结点n
- 创建存储结点的栈命名为stack
- 创建存储处理结点状态的栈status(1表示可以输出当前结点的值,0表示还在处理左右子树)
- 判断栈和n是否不为空,如果不为空重复执行以下操作
- 判断n是否为空如果不为空重复执行以下操作
- 将n压入stack
- 将0压入status
- n = n->left
//取出表示拿到栈顶元素后删除该元素
//获取表示只拿栈顶元素的值,不删除
- 判断stack是否为不为空并且status当前栈顶是否为1重复执行以下操作
- 取出status栈顶元素
- 取出stack栈顶元素并输出
- 判断stack是否不为空
- 取出status栈顶元素
- 将1压入status
- 获取stack栈顶元素赋值给n
- n = n->right
实现代码
Stack<T> stack = new Stack<>()
Stack<int> status = new Stack<>()
while(n != null || !stack.empty())
{
while (n != null)
{
stack.push(n)
status.push(0)
n = n.left
}
while(!stack.empty() && status.peek() == 1)
{
status.pop()
System.out.print(stack.pop().element + " ")
}
if(!stack.empty())
{
status.pop()
status.push(1)
n = stack.peek()
n = n.right
}
}