手动创建栈实现——树的深度优先搜索

 这里学到了使用自建栈的深度优先搜索算法,而不是递归调用使用DFS。

public class StackDFS {
  //使用栈来实现深度优先搜索
  public void dfsByStack(TreeNode root) {
    Stack stack = new Stack<>();

    stack.push(root);  //初始化压入根节点
    while (!stack.isEmpty()) {
      TreeNode node = stack.pop();

      if (node.sons.size() == 0) {
        //已经达到叶子结点,输出
        System.out.println(node.prefix + node.label);
      }else {
        //非叶子结点,遍历它的每个子节点
        Iterator> iter = node.sons.entrySet().iterator();
        //注意,这里使用了一个临时的栈 
        //这样做是为了保持遍历的顺序,和递归遍历的顺序是一致的
        //如果不要求一致,可以直接压入stack
        Stack stackTemp = new Stack<>();
        while (iter.hasNext()) {
          stackTemp.push(iter.next().getValue());
        }
        while (!stackTemp.isEmpty()) {
          stack.push(stackTemp.pop());
        }
      }
    }
  }
}

//前缀树结点
class TreeNode{
  public char label; //结点的名称,在前缀树里是单个字母
  public HashMap sons = null;//使用哈希映射存放子节点
  public String prefix = null;//从树的根到当前结点这条通路上,全部字母所组成的前缀
  
  public String explanantion = null;//词条的解释

  //初始化结点
  public TreeNode(char l, String pre, String exp) {
    label = l;
    prefix = pre;
    explanantion = exp;
    sons = new HashMap<>();
  }
}

 

你可能感兴趣的:(数据结构与算法)