二叉树构建与遍历

185 阅读1分钟

前序遍历

算法描述

  1. 将根节点赋值给暂存结点n,并创建栈命名为s
  2. 判断栈和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;
    }
}

后续遍历

算法描述

  1. 将根节点赋值给暂存结点n
  2. 创建存储结点的栈命名为stack
  3. 创建存储处理结点状态的栈status(1表示可以输出当前结点的值,0表示还在处理左右子树)
  4. 判断栈和n是否不为空,如果不为空重复执行以下操作
    1. 判断n是否为空如果不为空重复执行以下操作
      • 将n压入stack
      • 将0压入status
      • n = n->left
        //取出表示拿到栈顶元素后删除该元素
        //获取表示只拿栈顶元素的值,不删除
    2. 判断stack是否为不为空并且status当前栈顶是否为1重复执行以下操作
      • 取出status栈顶元素
      • 取出stack栈顶元素并输出
    3. 判断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;
    }
}