• 数据结构(二)二叉搜索树-非递归实现遍历


    说明:公用代码在上篇数据结构中,以下定义的方法都属于BTreeSort类的成员方法。

    先序遍历

    // 非递归先序遍历  -- 访问顺序先自己(中间)再左最后右 
        public void preTraversalStack(BTreeNode root) {
            if (null == root) {
                return;
            }
            Stack<BTreeNode> stack = new Stack<BTreeNode>();
            BTreeNode node = root;
            stack.push(node);
            while (node != null && !stack.isEmpty()) {
    10              printNode(node);
    11              // 栈是先进后出所以先把右边入栈
    12              if (null !=node.right){
    13                  stack.add(node.right);
    14              }
    15              // 左节点入栈
    16              if (null !=node.left){
    17                  stack.add(node.left);
    18              }
    19              node = stack.pop();
    20          }
    21      }

    中序遍历

    // 非递归中序遍历  -- 访问顺序先左再自己(中间)最后右 
        public void minTraversalStack(BTreeNode root){
            if (null == root) {
                return;
            }
            Stack<BTreeNode> stack = new Stack<BTreeNode>();
            BTreeNode node = root;
           
            while (node != null || !stack.isEmpty()){
    10              // 先左
    11              while (node != null){
    12                  stack.push(node);
    13                  node = node.left;
    14              }
    15              if (!stack.isEmpty()){
    16                  node = stack.pop();
    17                  printNode(node);
    18                  // 控制右转
    19                  node = node.right;
    20              }
    21          }
    22      }

    后序遍历

    // 非递归后序遍历  -- 访问顺序先左再右最后自己(中间) 
        public void afterTraversalStack(BTreeNode root){
            if (null == root) {
                return;
            }
            Stack<BTreeNode> stack = new Stack<BTreeNode>();
            BTreeNode node = root;
            BTreeNode lastNode = node; // 表示已经被访问过(打印过)的节点
            while (null != node){
    10              // 先左
    11              while (node != null){
    12                  stack.push(node);
    13                  node = node.left;
    14              }
    15              node = stack.pop();
    16              // 输出访问条件要么节点的右子树为空,要么右子树已经被访问过了
    17              while (null == node.right || node.right == lastNode){
    18                  printNode(node);
    19                  lastNode = node;
    20                  if (stack.isEmpty()){
    21                      return;
    22                  }
    23                  node = stack.pop();
    24              }
    25              stack.push(node);
    26              node = node.right; // 右转
    27          }
    28         
    29      }

    说明:

    后序遍历中要注意15行的出栈和25行的入栈,15行的出栈用于判读节点是否满足输出条件,而25行的入栈用于将目前还不满足条件的节点再入栈,随后进行右转。

  • 相关阅读:
    Spring加载xsd引起的问题小记
    kafka配置参数
    nginx常见内部参数,错误总结
    从毕业到现在的总结
    storm坑之---传递对象
    Java多线程读取大文件
    webpack4.0.1安装问题及解决方法
    git入门篇shell
    less教程
    原生js的ajax请求
  • 原文地址:https://www.cnblogs.com/jianyuan/p/5317713.html
Copyright © 2020-2023  润新知