非递归中序遍历的一点解释

9人阅读 评论(0) 收藏 举报
分类:

递归形式的前序,中序,后序,便利大家应该都是比较熟悉的。但是,有时候,在针对一些对BST遍历过程中节点状态控制的时候,使用非递归形式的算法,往往更加有效,代码更加简洁。
1. 先把二叉树的非递归中序遍历贴出。leetcode题目

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> list = new ArrayList<>();
    if(root == null) return list;
    Stack<TreeNode> stack = new Stack<>();
    while(root != null || !stack.empty()){
        while(root != null){
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        list.add(root.val);
        root = root.right;

    }
    return list;
}

代码很简单,就是用一个栈保存已有节点,再不断拿出节点判断即可。leetcode题目


现在我们可以用这种方法来解决,BST中第K小节点这个问题。

public int kthSmallest (TreeNode root, int k) {
     Stack<TreeNode> stack = new Stack<>();
     while(root != null || !stack.isEmpty()) {
         while(root != null) {
             stack.push(root);    
             root = root.left;   
         } 
         root = stack.pop();
         if(--k == 0) break;
         root = root.right;
     }
     return root.val;
}

我们也可以用来解决,有效的二叉树这个题目。leetcode题目

public boolean isValidBST(TreeNode root) {
   if (root == null) return true;
   Stack<TreeNode> stack = new Stack<>();
   TreeNode pre = null;
   while (root != null || !stack.isEmpty()) {
      while (root != null) {
         stack.push(root);
         root = root.left;
      }
      root = stack.pop();
      if(pre != null && root.val <= pre.val) return false;
      pre = root;
      root = root.right;
   }
   return true;
}
查看评论

二叉树遍历理解——递归及非递归方法中栈的利用

二叉树遍历理解——递归及非递归方法中栈的利用1.二叉树介绍二叉树是每个节点最多有两个子树的树结构,遍历方法有深度优先(包括:先序、中序、后序遍历)和宽度优先(层序遍历),层序遍历通过队列可以实现。这里...
  • sky_kkk
  • sky_kkk
  • 2017-11-15 17:49:10
  • 88

中序遍历(非递归)

//前序遍历 /*前序遍历的递归实现*/ void preOrder(BinTree *root){ if(NULL!=root){ coutdatarchild); } } /*非递归实现*...
  • u014142287
  • u014142287
  • 2016-09-18 21:55:39
  • 1145

[数据结构]对中序非递归遍历二叉树的理解与讨论

中序遍历二叉树,即是先遍历左子树,再访问根节点,最后遍历右子树,这个顺序对于每棵子树都是一样的,是访问子树的共性,故可依次顺序设置循环,逐一访问每个结点。对于每一个树的子树,均要完成此操作。故在开始遍...
  • rainer7
  • rainer7
  • 2004-08-10 21:26:00
  • 5665

二叉树的中序遍历(lintcode)(递归和非递归)

题目来源:lintcode 原题链接:二叉树的中序遍历 题目: 给出一棵二叉树,返回其节点值的后序遍历。 您在真实的面试中是否遇到过这个题?  Yes 样例 给出一棵二叉树 ...
  • lyy_hit
  • lyy_hit
  • 2015-11-19 22:04:59
  • 1363

非递归的中序树遍历算法

CLRS 12.1-3:来源:http://www.cnblogs.com/shuaiwhu/archive/2011/04/20/2065055.html 给出一个非递归的中序树遍历算法。(提示:...
  • fengzhongpiaoxing
  • fengzhongpiaoxing
  • 2015-05-16 18:59:25
  • 514

二叉树中序遍历非递归算法实现详解

二叉树是数据结构中的经典结构,也是应用很广泛的结构之一。二叉树具有一些特定的性质,如 n0 = n2+1,在一些应用中,常常要求在树中查找具有某些特征的节点,或者对树中节点进行处理,即遍历二叉树的问题...
  • gujinjin2008
  • gujinjin2008
  • 2014-05-22 20:50:08
  • 3462

中序遍历非递归算法(C语言版)

#include #include #define M 100 //前序遍历:ABD#E##FG###C## typedef struct tree/*二叉树*/ {   char data;  ...
  • wanying2001
  • wanying2001
  • 2015-11-30 21:39:34
  • 1029

不用栈,来实现二叉树的非递归中序遍历

如果要求只能用非递归方法,同时还不让用栈,来遍历完全二叉树,则每个结点必须有一个指向父结点的指针。 题目: 完全二叉树,采用三叉链表结构。 要求 不用递归,中序遍历这棵树。要求空间复杂度...
  • friendbkf
  • friendbkf
  • 2015-12-02 16:04:39
  • 1291

二叉树的中序非递归遍历c语言版

由于c语言没有c++的STL库,我们无法借助c++的stack库实现二叉树的非递归遍历,但是,我们完全可以自己打造一个c语言版的stack库。本篇博文就是借助我们之前在栈的链式 存储这篇博文实现的程序...
  • bbs375
  • bbs375
  • 2016-10-06 07:56:54
  • 2347
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 3239
    积分: 983
    排名: 5万+
    文章以移到我的个人博客
    # coderlongren.cn
    博客专栏
    文章存档
    最新评论